Cocos2d-x 动作之变速动作

大部分动作的变化过程是与时间成线性关系的,即一个动作经过相同时间产生的变化相同,例如,CCMoveBy会使节点在同样长的时间内经过同样的位移。这是因为Cocos2d-x把动作的速度变化控制抽离了出来,形成一个独立的机制。借助这个机制,我们可以很方便地实现诸如鱼的变速游动、金币的加速飞行以及后面将要介绍的动作平滑化等效果。普通动作配合变速动作,可以构造出很有趣的动作效果。

与复合动作类似,变速动作也是一种特殊的动作,它可以把任何一种动作按照改变后的速度执行。因此,在初始化变速动作时,需要传入一个动作。

变速动作包括CCSpeed动作与CCEase系列动作,下面我们详细介绍这些动作。

1. CCSpeed

CCSpeed用于线性地改变某个动作的速度,因此,可以实现成倍地快放或慢放功能。为了改变一个动作的速度,首先需要将目标动作包装到CCSpeed动作中:

CCRepeatForever* repeat = CCRepeatForever::create(animation);
CCSpeed* speed = CCSpeed::create(repeat, 1.0f);
speed->setTag(action_speed_tag);
fish->runAction(speed);

在上面的代码中,我们创建了一个animation动作的CCRepeatForever复合动作repeat,使动画被不断地重复执行。然后,我们又使用repeat动作创建了一个CCSpeed变速动作。create初始化方法中的两个参数分别为目标动作与变速比率。设置变速比率为1,目标动作的速度将不会改变。最后,我们为speed动作设置了一个tag属性,并把动作交给fish精灵,让精灵执行变速动作。此处设置的tag属性与CCNodetag属性类似,用于从节点中方便地查找动作。

接下来,在需要改变速度的地方,我们通过修改变速动作的speed属性来改变动作速度。下面的代码将会把上面设置的动画速度变为原来的两倍:

CCSpeed * speed = fish->getActionByTag(action_speed_tag);
speed->setSpeed(2.0f);

2. CCActionEase

虽然使用CCSpeed能够改变动作的速度,然而它只能按比例改变目标动作的速度。如果我们要实现动作由快到慢、速度随时间改变的变速运动,需要不停地修改它的speed属性才能实现,显然这是一个很烦琐的方法。下面将要介绍的CCActionEase系列动作通过使用内置的多种自动速度变化来解决这一问题。

CCActionEase系列包含15个动作,它们可以被概括为5类动作:指数缓冲、Sine缓冲、弹性缓冲、跳跃缓冲和回震缓冲。每一类动作都有3个不同时期的变换:In、Out和InOut。下面使用时间变换图像表示每组CCActionEase动作的作用效果,其中横座标表示实际动画时间,纵座标表示变换后的动画时间。因此,线性动作的图像应该是一条自左下角到右上角的直线。图4-3展示了Cocos2d-x的各种变速曲线。

指数缓冲:

enter image description here[+]查看原图

(a)easeInExpo (b)easeOutExpo (c)easeInOutExpo

Sine缓冲:

enter image description here[+]查看原图

(a)easeInSine (b)easeOutSine (c)easeInOutSine

弹性缓冲:

enter image description here[+]查看原图

(a)easeInElastic (b)easeOutElastic (c)easeInOutElastic

跳跃缓冲:

enter image description here[+]查看原图

(a)easeInBounce (b)easeOutBounce (c)easeInOutBounce

回震缓冲:

enter image description here[+]查看原图

(a)easeInBack (b)easeOutBack (c)easeInOutBack

图4-3 变速动作曲线

CCActionEase的使用方法与CCSpeed类似。以Sine缓冲为例,以下代码实现了InSine变速运动:

CCEaseSineIn* sineIn = CCEaseSineIn::create(action);
sineIn->setTag(action_sine_in_tag);
fish->runAction(sineIn);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章