Defold引擎默认支持多种动画,包含逐帧动画、补间动画、3D蒙皮动画、骨骼动画等,最常用的还是逐帧动画与补间动画,接下来分两篇文章分别来讲逐帧动画与补间动画。
逐帧动画就是把多张图片以一定速率进行切换播放,就像放电影似的,一个画面一个画面的切换,图片间差异越小,单位时间内切换的图片数量越多,播放的动画也就越平滑。
在Defold中需把多张图片组合为atlas对象,才能制作动画。可以Defold项目中放图片的文件夹上右键,建一个atlas对象,如下所示:
新建一个test.atlas对象,再给这个atlas对象添两个动画组,结果如下图所示:
从上图可以看出,给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方法,那么动画也会停止,并且也不会执行上面的完成回调。