:::: 菜单 ::::

从AS到cocos2d-Action

我之前是一个ASer,去年开始搞oc,今年接触cocos2d,学习的过程中有些体会,回顾一下,分享出来,也为更多从flash开发想转到cocos2d的同学做一个汇报和参考。学习cocos2d是一个愉快的过程,因为从starling转换过来觉得无比方便,就像当年从PureMVC转到Robotlegs,相见恨晚的感觉。

这篇文章记录学习cocos2d中Action的一点小结。

cocos2d的Action,类似flash中的动作补间动画,但它更为强大。

Flash中,你可以用动作补间做的所有事情,包括位置、旋转、缩放、颜色、不透明度,Cocos2D里的Action都可以做。
而我们在Flash的开发中,仅仅依靠位置、旋转、缩放、颜色、不透明度的变化是不够做出一款有趣的游戏的——这些仅仅是动画,更全面的动作,是令各项数值产生变化,且分为瞬间变化和随时间变化两种。

Flash中,我一般使用GTween来控制各项数值的变化。有个例子来阐述:比如做星际争霸中资源量显示的文本,当你消耗或采集到一些资源后,资源量显示文字不会直接变化,而是随时间跳动。那么我通常会创建一个自定义的TextField,实现一对getter和setter,GTween来更改他们的值,加入缓动效果。很多效果都可以透过这样来实现。甚至按照一定规则缓动换贴图。

好,那回到cocos2d,cocos2d中的Action,可以用来让节点执行**位置、旋转、缩放、变色、消失**等很多动作,而且由于它是施加在所有节点CCNode上,因此对精灵、标签、菜单甚至场景施加动作。这是一大灵活的特点。
我上面说了,真正的动作,分瞬间变化和随时间变化两种。cocos2d中的CCFiniteTimeAction就是分为CCActionInstant和CCActionInterval,CCFiniteTimeAction之外还有无限重复动作、跟随动作、调速动作。

CCActionInterval 间隔动作

间隔动作,其效果就是随时间变化的动作。通途最为广泛,子类数量很多。它的子类中,像CCMoveTo、CCMoveBy,CCScaleTo、CCScaleBy,CCFadeIn、CCFadeOut等等的都是顾名思义的位置、旋转、淡入淡出之类的常规功能。

其中有2类特殊常用的:
1. CCEase 缓动动作,许多子类实现
2. CCSequence 动作序列

CCEase 缓动动作

最初我使用了动作来做动画补间时想加缓动,在flash中,通常我用GTween(TweenLite、TweenMax同样)都是传入一个缓动函数来对一个补间。而到cocos2d里,其实缓动本身也是一个间隔动作。
比如我在三消的游戏中,需要让玩家因为消除产生加分的时候,分数提示文字从大到小缩放一下,形成一个冲击,而且加分越多,变化的比例越大,从大到小缩放的动画中加入一个反弹缓入缓出效果:

缓动的使用关键就是[curScoreLabel runAction:[CCEaseBackInOut actionWithAction:[CCScaleTo actionWithDuration:0.5 scale:1.0f]]];

CCSequence 动作序列

这个代码片段展示了0.4秒内先缩放到60%,再0.4秒缩放到100%。

CCActionInstant

瞬时动作,用来翻转、移动、设置可见性等,不过最被广泛用于动作序列执行到一定时机回调。

这个代码片段展示了缓动+回调+动作序列。
按顺序执行,先缓出播放一个缩放的动作,然后淡出,然后回调。

CCRepeatForever无限重复动作

会一直执行一个动作。要知道动作可以多次叠加动作,还可以按顺序执行,这样加上重复之后能实现很多效果,这个通常用得比较多。

CCFollow跟随动作

是让节点跟随另一个节点。

CCSpeed

可以调整一个动作的更新频率,其效果看起来就是在运行速度上加了个系数。

延伸阅读