Quick-cocos2d-x3.3 Study (十)--------- 添加动画
注意:在添加动画的时候必须先将图片添加到缓存中去
1 -- 将资源添加到精灵帧缓存 2 display.addSpriteFrames("image/animations/binggu.plist", "image/animations/binggu.png")
添加动画
这里我们通过帧动画实现游戏角色的运动,帧动画的原理是将连续的帧图像(如下图)在渲染的时候通过逐帧或插值的方式播放出来而形成的动态效果。就像翻动小人书一样。
引擎中,帧动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果。帧动画由帧组成,每一帧都是一个纹理,我们可以使用一个纹理序列来创建动画。
Quick 框架中,我们可以这样来播放一个动画:
1 -- 创建一个包含flying1.png到flying4.png的4个图像帧对象的数组 2 local frames = display.newFrames( "flying.png", 1, 4 ) 3 4 -- 以包含图像帧的数组创建一个动画 Animation 对象 5 local animation = display.newAnimation( frames, 0.3 / 4 ) 6 7 -- 在显示对象上循环播放动画,并返回 Action 动画动作对象 8 tranisition.playAnimationForever( self, animation )
因为我们的游戏对象有不只一种的动画,所以在本教程中,我们可以先把这些动画都添加到动画缓存,这样在需要播放相应的动画的时候,我们就可以从缓存中直接获取动画来播放了,而不用再浪费时间重新创建动画
所以,请在 Player.lua 文件中添加如下的一段函数:
1 function Player:addAnimationCache() 2 local animations = { "flying", "drop", "die" } 3 local animationFrameNum = { 4, 3, 4 } 4 5 for i = 0, #animations do 6 -- 1 7 local frames = display.newFrames( animations[i] .. "%d.png", 1, animationFrameNum[i] ) 8 -- 2 9 local animation = display.newAnimation( frames, 0.3 / 4 ) 10 -- 3 11 display.setAnimationCache( animations[i], animation) 12 13 end 14 15 end
animations,animationFrameNum分别表示角色的三种动画和三种动画分别有的帧总数。
遍历animations时,下面一一解释下函数的作用:
- 创建一个包含animations[i]1.png到animations[i]animationFrameNum[i].png的图像帧对象的数组,如i = 1,就是创建一个包含flying1.png到flying4.png的图像帧对象的数组。其中..是字符串连接操作符,它可以用来连接两个字符串。当其中一个为其它类型时,它会把该类型也转为字符串。
- 以包含图像帧的数组创建一个动画 Animation 对象,参数 0.3 / 4 表示 0.3 秒播放完 4 桢。
- 将2中创建好的 animation 对象以指定的名称(animations[i])加入到动画缓存中,以便后续反复使用。也就是我们在 AnimationCache 中可以通过animations = {“flying”, “drop”, “die”}这三种动画的名称来查找制定的 animation 对象。
把动画载入缓存后,我们就可以写下对应的函数去执行动画了。如下:
1 function Player:flying() 2 transition.stopTarget( self ) 3 transition.playAnimationForever( self, display.getAnimationCache( "flying" ) ) 4 5 end 6 7 function Player:drop() 8 transition.stopTarget( self ) 9 transition.playAnimationForever( self, display.getAnimationCache( "drop" ) ) 10 end 11 12 function Player:die() 13 transition.stopTarget( self ) 14 transition.playAnimationForever( self, display.getAnimationCache( "die" ) ) 15 end
最后在创建 Player 对象后,我们就可以调用以上相应的方法来播放指定的动画了
实例:
1 function GameScene:ctor() 2 -- 将资源添加到精灵帧缓存 3 display.addSpriteFrames("image/animations/binggu.plist", "image/animations/binggu.png") 4 5 self.player = display.newSprite( "#binggu_01.png" ) 6 :align( display.CENTER, display.cx / 4, display.cy ) 7 :addTo(self) 8 9 -- 创建一个包含flying1.png到flying4.png的4个图像帧对象的数组 10 local frames = display.newFrames( "binggu_0%d.png", 1, 7 ) 11 12 -- 以包含图像帧的数组创建一个动画 Animation 对象 13 local animation = display.newAnimation( frames, 0.3 / 4 ) 14 15 -- 在显示对象上循环播放动画,并返回 Action 动画动作对象 16 transition.playAnimationForever( self.player, animation ) 17 18 end