下载 App

taptap制造png序列动画相关代码(性能问题自行解决)

03/14176 浏览开发交流
-- ============================================================================
-- NanoVG 画布项目 - 帧序列动画播放
-- 设计分辨率: 750 x 1334 (竖版)
-- 分辨率模式: A(设计分辨率)
-- ============================================================================
-- ============================================================================
-- 1. 全局变量
-- ============================================================================
local physW, physH
local dpr
local logicalW, logicalH
-- 设计分辨率
local designW, designH = 750, 1334
-- 布局变量
local scale
local screenDesignW, screenDesignH
local designOffsetX, designOffsetY
-- NanoVG
local vg = nil
local fontNormal
-- 帧动画
local FRAME_COUNT = 35
local frameImages = {}    -- NanoVG 图片句柄
local frameW, frameH = 0, 0  -- 帧图片尺寸
local currentFrame = 1
local frameTimer = 0
local FPS = 24             -- 播放帧率
-- ============================================================================
-- 2. 布局计算
-- ============================================================================
local function RecalcLayout()
    physW, physH = graphics:GetWidth(), graphics:GetHeight()
    dpr = graphics:GetDPR()
    logicalW, logicalH = physW / dpr, physH / dpr
    scale = math.min(logicalW / designW, logicalH / designH)
    screenDesignW = logicalW / scale
    screenDesignH = logicalH / scale
    designOffsetX = (screenDesignW - designW) / 2
    designOffsetY = (screenDesignH - designH) / 2
end
-- ============================================================================
-- 3. 加载帧序列
-- ============================================================================
local function LoadFrames()
    for i = 0, FRAME_COUNT - 1 do
        local filename = string.format("image/skill_100004_tx-animation_%02d.png", i)
        local handle = nvgCreateImage(vg, filename, 0)
        if handle and handle > 0 then
            frameImages[i + 1] = handle
            -- 取第一帧的尺寸
            if i == 0 then
                frameW, frameH = nvgImageSize(vg, handle)
                print(string.format("帧尺寸: %dx%d", frameW, frameH))
            end
        else
            print("加载失败: " .. filename)
        end
    end
    print(string.format("已加载 %d/%d 帧", #frameImages, FRAME_COUNT))
end
-- ============================================================================
-- 4. 生命周期
-- ============================================================================
function Start()
    -- 初始化 NanoVG
    vg = nvgCreate(1)  -- 1 = NVG_ANTIALIAS
    fontNormal = nvgCreateFont(vg, "sans", "Fonts/MiSans-Regular.ttf")
    -- 计算布局
    RecalcLayout()
    -- 加载帧序列
    LoadFrames()
    -- 订阅事件
    SubscribeToEvent("NanoVGRender", "HandleNanoVGRender")
    SubscribeToEvent("Update", "HandleUpdate")
    SubscribeToEvent("ScreenMode", "HandleScreenMode")
    print("=== 画布已启动: " .. designW .. "x" .. designH .. " ===")
end
-- ============================================================================
-- 5. 更新逻辑
-- ============================================================================
---@param eventType string
---@param eventData UpdateEventData
function HandleUpdate(eventType, eventData)
    local dt = eventData["TimeStep"]:GetFloat()
    -- 帧计时
    frameTimer = frameTimer + dt
    local interval = 1.0 / FPS
    if frameTimer >= interval then
        frameTimer = frameTimer - interval
        currentFrame = currentFrame + 1
        if currentFrame > #frameImages then
            currentFrame = 1  -- 循环播放
        end
    end
end
-- ============================================================================
-- 6. 渲染
-- ============================================================================
function HandleNanoVGRender()
    nvgBeginFrame(vg, logicalW, logicalH, dpr)
    nvgScale(vg, scale, scale)
    -- 屏幕空间:填满整个屏幕(灰色)
    nvgBeginPath(vg)
    nvgRect(vg, 0, 0, screenDesignW, screenDesignH)
    nvgFillColor(vg, nvgRGBA(128, 128, 128, 255))
    nvgFill(vg)
    -- 进入设计空间 (750 x 1334)
    nvgTranslate(vg, designOffsetX, designOffsetY)
    -- 绘制当前帧(居中显示)
    local imgHandle = frameImages[currentFrame]
    if imgHandle then
        local drawX = (designW - frameW) / 2
        local drawY = (designH - frameH) / 2
        local paint = nvgImagePattern(vg, drawX, drawY, frameW, frameH, 0, imgHandle, 1)
        nvgBeginPath(vg)
        nvgRect(vg, drawX, drawY, frameW, frameH)
        nvgFillPaint(vg, paint)
        nvgFill(vg)
    end
    nvgEndFrame(vg)
end
function HandleScreenMode()
    RecalcLayout()
end
TapTap
猜你想搜
taptap 制造nanovg画布项目
【新游上线】末日100天截图
【新游上线】末日100天
大家好,我们是《末日100天》的开发者Paul~ 这是一款围绕「生存-经营-轮回」展开的废土策略小游戏:白天分配 3 点行动力经营据点,夜里迎接十天一循环的尸潮,每张地图第 100 天还有一场首领战等着你。五张地图、五大区域机制、可继承的轮回遗产,以及钻石商城里的抽奖机——我们希望每次重开都有一点点新意。 以下是游戏简单介绍: 1.游戏背景 废土历元年,未知病毒席卷全球,城市化为死地。幸存者们退守
9 赞
6 回复
03:06
为了不被斩杀,我只能做到这些了截图
为了不被斩杀,我只能做到这些了
之前一直申请不到计划3,之前说太花哨,后面说体量完成度不足,在我一番小作文下,编辑终于给了我解答,什么原生质感,玩家开局体验啥的。 本来计划2也够用,准备以后再优化了,结果计划2赠送的积分要砍半了,学生党实在消费不起,于是只能再冲一波计划3了 从周六中午到现在一天半时间,优化了一遍角色卡,战斗卡,还有抽卡界面,优化了新手教程,该说不说确实比之前要舒服些。 前半部分为新版,后半部分为旧版。 明天再次
45 赞
9 回复
别再烧积分了!从每次 2000 到每次 50 的血泪经验截图
别再烧积分了!从每次 2000 到每次 50 的血泪经验
适用场景:所有在用 TapTap Code 开发游戏的小白 难度:★☆☆☆☆ 背景最近群里总有人"炫耀"一次操作花了几千积分,说实话这不是值得高兴的事——这是在告诉所有人你的开发方式有根本性问题。我也走过这条弯路,所以来说说怎么改。 积分消耗的本质是什么积分 = AI 处理的 token 数量 = 你发给 AI 的内容 + AI 回给你的内容所以烧积分的本质只有两种: 你让 AI 做了大量无效/重
精华
68 赞
21 回复
如何提升你游戏中的UI美术水平截图
如何提升你游戏中的UI美术水平
一、请为你的游戏挑选一款合适的字体 很多开发者没有注意到其实UI界面中最重要的元素是字体,一款合适的字体能给整个游戏的界面感官带来蜕变。 请看案例 那么如何挑选适合自己的字体呢? 我总结出了一些小经验可供参考: 黑体:通用 宋体:古风、武侠、修仙 楷体:古风、武侠、修仙 圆体:卡通、动漫、Q版 科技:科幻、未来、电子 顺手分享一个免费可商用字体网站: 当然 如果你不知道自己的游戏适合什么风格
精华
124 赞
44 回复
【UI教程】如何将已有的效果图应用为实际的UI界面截图
【UI教程】如何将已有的效果图应用为实际的UI界面
在经过了一些折腾和比较折磨的尝试后,我总算是摸清楚了嗒啦啦怎么把UI效果图转换为实际游戏中的UI组件,今天就给大家带来这部分的经验分享。 tips:1.本篇教程需要各位掌握最基本的ps使用,具体的操作部分我会大致讲解,但仍需各位自行学习ps的基本操作,部分可以由ai代劳的环节我会注明。 2.本篇教程需要在以我前两篇教程作为前置环节,请在阅读这两篇前置教程后再进行本篇教程内容的学习 在按照前
11 赞
5 回复
开发心得-界面布局心得截图
开发心得-界面布局心得
大家好,我正在用 TapTap 制造制作一款2D 治愈林间徒步旅行游戏《徒步荒野》。 我分享一下我的开发心得,希望能有用,下面是一些界面布局的心得。 第一步:定版式、操作 先确定游戏是横版还是竖版、需要哪些操作按钮,敲定整体玩法思路。 我的玩法灵感参考《边境之旅》,主打散步看风景、沿途触发随机事件。 原版是 3D,考虑到自己是新手,选择2D 横版街机式来做,制作更简单、好上手。 第二步:敲定全局美
6 赞
3 回复
01:29
官方阅,申请积分计划2,希望官方继续支持我完成这款游戏,截图
官方阅,申请积分计划2,希望官方继续支持我完成这款游戏,
视频内容只是一部分, 本游戏耗时3个月,目前完成进度百分之80, 是生存游戏,进入修仙界,走剧情找到宗门加入, 这时游戏才是真正开始, 提升实力境界后就可以变强,获取功法法术法宝, @视频内是游戏里挑战妖族入侵一种主流玩法,游戏就是围绕着这个来进行, 还有很多地方可以战斗,获得资源修炼变强,比如去藏书阁学习功法, 去法宝楼抽法宝,每一个宗门数十个法宝抽取 去修仙界探索,获得各自的资源,可能遇见妖兽
1 赞
3 回复
3D场景中的物体摆放——道具屋经营物语的踩坑日志截图
3D场景中的物体摆放——道具屋经营物语的踩坑日志
大家好~这里是道具屋经营物语。 我将在本帖分享一下在制作过程中遇到的问题和最后解决方法。将踩过的坑一一诉说[表情_微笑]。 在游戏制作过程中,为了增加画面表现力,以及适配移动端的简便操作,在想到哪做到哪的胡乱设计下。选择了采用上方3D视口,下方操作菜单的GBA式UI布局。如下图: 当时我觉得这样一定会很酷吧哈哈哈(后面被UI和3D场景设计狠狠折磨)。 ·3D场景的布局设计 那么上面的3D时候中的场
精华
10 赞
1 回复
2D 等轴测视角:完整理论截图
2D 等轴测视角:完整理论
2D 等轴测视角:完整理论 一、视角的本质 什么是等轴测 人站在高处斜着往下看地面,地面上的方格子不再是正方形,而变成了菱形。这就是等轴测的视觉本质。 俯视(正上方看下去): 等轴测(斜上方看下去): ┌──┬──┬──┐ ◇ ├──┼──┼──┤ ◇ ◇ ├──┼──┼──┤ ◇ ◇ ◇ └──┴──┴──┘ ◇ ◇ ◇ 正方形网格经过旋转 + 压缩,变成了菱形网格。 为什么是 2:1
6 赞
【Tap make 塔拉拉之立项干货】萌新看过来!截图
【Tap make 塔拉拉之立项干货】萌新看过来!
题外话:本人也是tap make 使用者之一。塔啦啦忠实信徒、天哥忠实拥护者、八年游戏策划经验的低级策划。但是!我已经做出来一款5000+热度、且稳定可更新的框架、并且还在持续产出更多游戏内容的橘猫! 这几天正好在开新坑。我是3月初加入的tapmake大家庭。两周时间于3月25日将这个作品上架。当时的全凭感觉摸索。如今,自己也是一个有自己项目的小菜鸡了。今天,就来分享一下,如何高效的制作一款高大上
投票精华
69 赞
24 回复