Defold动画之逐帧动画

85 阅读2分钟

Defold引擎默认支持多种动画,包含逐帧动画、补间动画、3D蒙皮动画、骨骼动画等,最常用的还是逐帧动画与补间动画,接下来分两篇文章分别来讲逐帧动画与补间动画。

逐帧动画就是把多张图片以一定速率进行切换播放,就像放电影似的,一个画面一个画面的切换,图片间差异越小,单位时间内切换的图片数量越多,播放的动画也就越平滑。

在Defold中需把多张图片组合为atlas对象,才能制作动画。可以Defold项目中放图片的文件夹上右键,建一个atlas对象,如下所示:

图片.png

新建一个test.atlas对象,再给这个atlas对象添两个动画组,结果如下图所示:

图片.png

从上图可以看出,给atlas两个动画组,一个名为up,另一个名为down,并且都向up和down两个动画组添加了图片。使用鼠标选中动画组名称时,点击空格键,会在编辑器的左下角预览到这个动画。在属性面板中可以设置这个动画每秒的帧率,通过设置Fps的值改变帧率。通过Playback可以设定动画的播放方式。其中Playback的值有以下几种,如下表所示:

Playback值说明
Once Forward从头到尾运行一次
Once Backward从尾到头动行一次
Once PingPong从头到尾再从尾到头运行一次
Loop Forward从头到尾进行循环 
Loop Backward从尾到头进行循环
Loop PingPong从头到尾再从尾到头进行循环

在Defold引擎中,Sprite与GUI两个对象都支持插放逐帧动画,他们的方法使用方式基本相同,下面以Sprite的逐帧动画为示例所示:

-- 表示执行sprite组件的,up这个动画组
sprite.play_flipbook("#sprite", "up")

local function animate_finished(self, message_id, message, sender)
    -- 执行动画结束之后的逻辑,如果是以loop进行循环播放的动画,不会触发此方法。
end
-- 表示执行sprite组件的up动画完成之后,再调用animate_finished方法
sprite.play_flipbook("#sprite", "up", animate_finished)

还需要注意,如果在执行play_flipbook方法过程中,这个组件所在的game object如果调用了cancel_animations方法,那么动画也会停止,并且也不会执行上面的完成回调。