动画与动作,在quick中都有对其封装,所以我们还是来看一下吧。
总的来说,对于帧动画,quick封装的方法我们可以经常使用,这是非常方便的,下面直接上代码来直观感受下,
比如,14张帧图片,采用cocos2d-x lua的方法来写是这样的,
- localsp=display.newSprite("grossini_dance_01.png",display.cx,display.cy)
- self:addChild(sp)
-
- localanimation=CCAnimation:create()
- localnumber,name
- fori=1,14do
- ifi<10then
- number="0"..i
- else
- number=i
- end
- name="grossini_dance_"..number..".png"
- animation:addSpriteFrameWithFileName(name)
- end
- animation:setDelayPerUnit(2.8/14.0)
- localaction=CCAnimate:create(animation)
- sp:runAction(action)
需要将其每一帧添加到CCAnimation中,和C++使用是一样的,但是quick的用法就是这样子的了,
display.addSpriteFramesWithFile("hero.plist","hero.png")--添加帧缓存
-
- localsp=display.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=display.newFrames("grossini_dance_%02d.png",1,14)
- localanimation=display.newAnimation(frames,2.8/14.0)
- sp:playAnimationOnce(animation)
display.newFrames(pattern,begin,length,isReversed)的各个参数的意义是,
- stringpattern模式字符串
- integerbegin起始索引
- integerlength长度
- booleanisReversed是否是递减索引
此外注意的是,newFrames里面的图片名称一定是帧缓存里面的图片名称,所以换句话说,我们之前需要将图片们用图片打包工具处理下,如果是采用多个单张图片的形式,肯定是不行的,可以想到,我们后期图片肯定都是采用图片打包工具处理的,所以quick就直接封装了这个方法。
不信的话,可以看下这个函数的源代码,
functiondisplay.newFrames(pattern,isReversed)
- localframes={}
- localstep=1
- locallast=begin+length-1
- ifisReversedthen
- last,begin=begin,last
- step=-1
- forindex=begin,last,stepdo
- localframeName=string.format(pattern,index)
- localframe=sharedSpriteFrameCache:spriteFrameByName(frameName)
- ifnotframethen
- printError("display.newFrames()-invalidframe,name%s",tostring(frameName))
- return
- frames[#frames+1]=frame
- returnframes
- end
直接是调用spriteFrameByName函数。
对于播放动画,quick给Sprite精灵类提供了两个函数,
functionSprite:playAnimationOnce(animation,removeWhenFinished,onComplete,delay)
- returntransition.playAnimationOnce(self,animation,delay)
- functionSprite:playAnimationForever(animation,delay)
- 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
一个是播放动画一次,一个是永久播放动画。好用!
以上就是动画的用法,接下来我们再看关于动作的使用,
动作封装的类是transition,其中提供了这些函数,
transition.newEasing(action,easingName,more) |
为图像创造效果 |
transition.execute(target,action,args) |
执行一个动作效果 |
transition.rotateTo(target,args) |
将显示对象旋转到指定角度,并返回 CCAction 动作对象。 |
transition.moveTo(target,args) |
将显示对象移动到指定位置,并返回 CCAction 动作对象。 |
transition.fadeTo(target,args) |
将显示对象的透明度改变为指定值,并返回 CCAction 动作对象。 |
transition.scaleTo(target,args) |
将显示对象缩放到指定比例,并返回 CCAction 动作对象。 |
transition.sequence(actions) |
创建一个动作序列对象。 |
transition.playAnimationOnce(target,delay) |
在显示对象上播放一次动画,并返回 CCAction 动作对象。 |
在我用来,我觉得像move,scale,fade这些单一的动作,我们用原生lua提供的那些就可以了,还容易被记住和使用,比如移动就使用CCMoveTo,还是挺好的。不过quick封装的个人觉得很不错的是,
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了。廖大真是写到我的心坎里去了。像这样,
transition.execute(sprite,CCMoveTo:create(1.5,CCPoint(display.cx,display.cy)),{
- delay=1.0,
- easing="backout",
- onComplete=function()
- print("movecompleted")
- end,
- })
transition.sequence也是一个方便的函数,如果要是以前,对于多个动作依次执行,咱们得这样,
localmove1=CCMoveBy:create(1,ccp(250,0))
- localmove2=CCMoveBy:create(1,ccp(0,50))
- localarray=CCArray:createWithCapacity(2)
- array:addObject(move1)
- array:addObject(move2)
- localseq=CCSequence:create(array)
要把每个动作装在数组里面,然后才能创建一个CCSequence,而现在呢,
localsequence=transition.sequence({
- 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))
- })
直接和C++的写法一样,依次创建添加进去就可以了,非常方便~
以上就是全部内容了。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|