quick-cocos2d-x游戏开发【8】——动画与动作

前端之家收集整理的这篇文章主要介绍了quick-cocos2d-x游戏开发【8】——动画与动作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

动画与动作,在quick中都有对其封装,所以我们还是来看一下吧。

总的来说,对于帧动画,quick封装的方法我们可以经常使用,这是非常方便的,下面直接上代码来直观感受下,

比如,14张帧图片,采用cocos2d-x lua的方法来写是这样的,

  1. localsp=display.newSprite(@H_403_21@"grossini_dance_01.png"@H_403_21@,display.cx,display.cy)@H_403_21@@H_403_21@
  2. self:addChild(sp)@H_403_21@
  3. @H_403_21@
  4. localanimation=CCAnimation:create()@H_403_21@
  5. localnumber,name@H_403_21@
  6. for@H_403_21@i=1,14@H_403_21@do@H_403_21@@H_403_21@@H_403_21@
  7. if@H_403_21@i<10then@H_403_21@@H_403_21@
  8. number="0"@H_403_21@..i@H_403_21@@H_403_21@
  9. else@H_403_21@@H_403_21@@H_403_21@
  10. number=i@H_403_21@
  11. end@H_403_21@
  12. name="grossini_dance_"@H_403_21@..number..@H_403_21@".png"@H_403_21@@H_403_21@@H_403_21@
  13. animation:addSpriteFrameWithFileName(name)@H_403_21@
  14. end@H_403_21@
  15. animation:setDelayPerUnit(2.8/14.0)@H_403_21@
  16. localaction=CCAnimate:create(animation)@H_403_21@
  17. sp:runAction(action)@H_403_21@

需要将其每一帧添加到CCAnimation中,和C++使用是一样的,但是quick的用法就是这样子的了,@H_403_21@

[html] copy
    display.addSpriteFramesWithFile("hero.plist","hero.png")--添加帧缓存@H_403_21@@H_403_21@
  1. @H_403_21@
  2. localsp@H_403_21@=@H_403_21@display@H_403_21@.newSprite("#grossini_dance_01.png",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> localframes@H_403_21@=@H_403_21@display@H_403_21@.newFrames("grossini_dance_%02d.png",1,14)@H_403_21@@H_403_21@
  3. localanimation@H_403_21@=@H_403_21@display@H_403_21@.newAnimation(frames,2.8/14.0)@H_403_21@@H_403_21@
  4. sp:playAnimationOnce(animation)@H_403_21@

display.newFrames(pattern,begin,length,isReversed)的各个参数的意义是,@H_403_21@

  • stringpattern模式字符串
  • integerbegin起始索引
  • integerlength长度
  • booleanisReversed是否是递减索引
此外注意的是,newFrames里面的图片名称一定是帧缓存里面的图片名称,所以换句话说,我们之前需要将图片们用图片打包工具处理下,如果是采用多个单张图片的形式,肯定是不行的,可以想到,我们后期图片肯定都是采用图片打包工具处理的,所以quick就直接封装了这个方法。@H_403_21@

不信的话,可以看下这个函数的源代码

copy
    functiondisplay.newFrames(pattern,isReversed)@H_403_21@@H_403_21@
  1. localframes@H_403_21@={}@H_403_21@@H_403_21@
  2. localstep@H_403_21@=@H_403_21@1@H_403_21@@H_403_21@@H_403_21@
  3. locallast@H_403_21@=@H_403_21@begin@H_403_21@+length-1@H_403_21@@H_403_21@
  4. ifisReversedthen@H_403_21@
  5. last,begin@H_403_21@=@H_403_21@begin@H_403_21@,last@H_403_21@@H_403_21@
  6. step@H_403_21@=-1@H_403_21@@H_403_21@
  7. forindex@H_403_21@=@H_403_21@begin@H_403_21@,last,stepdo@H_403_21@@H_403_21@
  8. localframeName@H_403_21@=@H_403_21@string@H_403_21@.format(pattern,index)@H_403_21@@H_403_21@
  9. localframe@H_403_21@=@H_403_21@sharedSpriteFrameCache@H_403_21@:spriteFrameByName(frameName)@H_403_21@@H_403_21@
  10. ifnotframethen@H_403_21@
  11. printError("display.newFrames()-invalidframe,name%s",tostring(frameName))@H_403_21@
  12. return@H_403_21@
  13. frames[#frames+1]=frame@H_403_21@
  14. returnframes@H_403_21@
  15. end@H_403_21@


直接是调用spriteFrameByName函数。@H_403_21@


对于播放动画,quick给Sprite精灵类提供了两个函数

copy
    functionSprite:playAnimationOnce(animation,removeWhenFinished,onComplete,delay)@H_403_21@@H_403_21@
  1. returntransition.playAnimationOnce(self,animation,delay)@H_403_21@
  2. functionSprite:playAnimationForever(animation,delay)@H_403_21@
  3. returntransition.playAnimationForever(self,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> end@H_403_21@

一个是播放动画一次,一个是永久播放动画。好用!@H_403_21@


以上就是动画的用法,接下来我们再看关于动作的使用,

动作封装的类是transition,其中提供了这些函数

@H_140_403@ @H_926_404@transition.newEasing(action,easingName,more) @H_140_403@ @H_140_403@ @H_926_404@transition.execute(target,action,args) @H_140_403@ @H_140_403@ @H_926_404@transition.rotateTo(target,args) @H_140_403@ @H_140_403@ @H_926_404@transition.moveTo(target,args) @H_140_403@ @H_140_403@ @H_926_404@transition.fadeTo(target,args) @H_140_403@ @H_140_403@ @H_926_404@transition.scaleTo(target,args) @H_140_403@ @H_140_403@ @H_926_404@transition.sequence(actions) @H_140_403@ @H_140_403@ @H_926_404@transition.playAnimationOnce(target,delay) @H_140_403@
为图像创造效果
执行一个动作效果
显示对象旋转到指定角度,并返回 CCAction 动作对象。
显示对象移动到指定位置,并返回 CCAction 动作对象。
显示对象的透明度改变为指定值,并返回 CCAction 动作对象。
显示对象缩放到指定比例,并返回 CCAction 动作对象。
创建一个动作序列对象。
显示对象上播放一次动画,并返回 CCAction 动作对象。

在我用来,我觉得像move,scale,fade这些单一的动作,我们用原生lua提供的那些就可以了,还容易被记住和使用,比如移动就使用CCMoveTo,还是挺好的。不过quick封装的个人觉得很不错的是,@H_403_21@

transition.execute(target,args)

transition.sequence(actions)

这两个,为啥呢,接着看,


transition.execute() 是一个强大的工具,可以为原本单一的动作添加各种附加特性。

transition.execute() 的参数表格支持下列参数:

  • delay: 等待多长时间后开始执行动作
  • easing: 缓动效果的名字及可选的附加参数,效果名字不区分大小写
  • onComplete: 动作执行完成后要调用函数
  • time: 执行动作需要的时间

transition.execute() 支持的缓动效果

  • backIn
  • backInOut
  • backOut
  • bounce
  • bounceIn
  • bounceInOut
  • bounceOut
  • elastic,附加参数默认为 0.3
  • elasticIn,附加参数默认为 0.3
  • elasticInOut,附加参数默认为 0.3
  • elasticOut,附加参数默认为 0.3
  • exponentialIn,附加参数默认为 1.0
  • exponentialInOut,附加参数默认为 1.0
  • exponentialOut,附加参数默认为 1.0
  • In,附加参数默认为 1.0
  • InOut,附加参数默认为 1.0
  • Out,附加参数默认为 1.0
  • rateaction,附加参数默认为 1.0
  • sineIn
  • sineInOut
  • sineOut
这个函数可以完成运动中的速度效果,以及CCCallFunc,CCDelayTime等功能,将其附加在一起,就不用写繁琐的函数嵌套和CCSequence了。廖大真是写到我的心坎里去了。像这样,@H_403_21@

copy
    transition.execute(sprite,CCMoveTo:create(1.5,CCPoint(display.cx,display.cy)),{@H_403_21@@H_403_21@
  1. delay@H_403_21@=@H_403_21@1@H_403_21@.0,@H_403_21@@H_403_21@
  2. easing@H_403_21@=@H_403_21@"backout"@H_403_21@,@H_403_21@@H_403_21@
  3. onComplete@H_403_21@=@H_403_21@function@H_403_21@()@H_403_21@@H_403_21@
  4. print("movecompleted")@H_403_21@
  5. end,@H_403_21@
  6. })@H_403_21@

transition.sequence也是一个方便的函数,如果要是以前,对于多个动作依次执行,咱们得这样,@H_403_21@

copy
    local@H_403_21@move1@H_403_21@=@H_403_21@CCMoveBy@H_403_21@:create(1,ccp(250,0))@H_403_21@@H_403_21@
  1. localmove2@H_403_21@=@H_403_21@CCMoveBy@H_403_21@:create(1,ccp(0,50))@H_403_21@@H_403_21@
  2. localarray@H_403_21@=@H_403_21@CCArray@H_403_21@:createWithCapacity(2)@H_403_21@@H_403_21@
  3. array:addObject(move1)@H_403_21@
  4. array:addObject(move2)@H_403_21@
  5. localseq@H_403_21@=@H_403_21@CCSequence@H_403_21@:create(array)@H_403_21@@H_403_21@

要把每个动作装在数组里面,然后才能创建一个CCSequence,而现在呢,@H_403_21@

copy
    local@H_403_21@sequence@H_403_21@=@H_403_21@transition@H_403_21@.sequence({@H_403_21@@H_403_21@
  1. CCMoveBy:create(1,0)),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CCMoveBy:create(1,50))@H_403_21@
  2. })@H_403_21@

直接和C++的写法一样,依次创建添加进去就可以了,非常方便~@H_403_21@


以上就是全部内容了。

猜你在找的Cocos2d-x相关文章