This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
逐帧动画由一系列静态图像连续显示组成。这种技术非常类似于传统的赛璐珞动画(参见 http://en.wikipedia.org/wiki/Traditional_animation)。由于每一帧都可以单独操作,该技术提供了无限的可能性。然而,由于每一帧都存储在独特的图像中,内存占用可能会很高。动画的平滑度也取决于每秒显示的图像数量,但增加图像数量通常也会增加工作量。Defold 逐帧动画要么作为添加到图集中的单独图像存储,要么作为瓷砖图源存储,所有帧以水平序列排列。
精灵和GUI方块节点可以播放逐帧动画,您可以在运行时对它们进行很好的控制。
sprite.play_flipbook()
函数。请参见下面的示例。gui.play_flipbook()
函数。请参见下面的示例。ping-pong 播放模式会将动画播放到最后一帧,然后反转顺序并播放回动画的第二帧,而不是回到第一帧。这样做是为了使动画链接更容易。
假设您的游戏有一个”闪避”功能,允许玩家按下特定按钮进行闪避。您已经创建了四个动画来支持此功能的视觉反馈:
以下脚本提供了逻辑:
local function play_idle_animation(self)
if self.dodge then
sprite.play_flipbook("#sprite", hash("dodge_idle"))
else
sprite.play_flipbook("#sprite", hash("idle"))
end
end
function on_input(self, action_id, action)
-- "dodge" 是我们的输入动作
if action_id == hash("dodge") then
if action.pressed then
sprite.play_flipbook("#sprite", hash("start_dodge"), play_idle_animation)
-- 记住我们正在闪避
self.dodge = true
elseif action.released then
sprite.play_flipbook("#sprite", hash("stop_dodge"), play_idle_animation)
-- 我们不再闪避了
self.dodge = false
end
end
end
当为节点选择动画或图像时,实际上您是在一次性分配图像源(图集或瓷砖图源)和默认动画。图像源在节点中静态设置,但当前要播放的动画可以在运行时更改。静态图像被视为单帧动画,因此在运行时更改图像相当于为节点播放不同的逐帧动画:
function init(self)
local character_node = gui.get_node("character")
-- 这要求节点在与我们正在播放的新动画/图像相同的图集或瓷砖图源中
-- 具有默认动画。
gui.play_flipbook(character_node, "jump_left")
end
sprite.play_flipbook()
和 gui.play_flipbook()
函数支持一个可选的 Lua 回调函数作为最后一个参数。当动画播放到结束时,将调用此函数。对于循环动画,永远不会调用该函数。回调函数可用于在动画完成时触发事件或将多个动画链接在一起。示例:
local function flipbook_done(self)
msg.post("#", "jump_completed")
end
function init(self)
sprite.play_flipbook("#character", "jump_left", flipbook_done)
end
local function flipbook_done(self)
msg.post("#", "jump_completed")
end
function init(self)
gui.play_flipbook(gui.get_node("character"), "jump_left", flipbook_done)
end
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB