变速动作和复合动作类似,也是一种特殊的动作,它可以把任何动作按照改变后的速度执行。变速动作与复合动作最大的区别就是复合动作只是单纯的组合一系列动作,而变速的做在组合一系列动作后还要去改变动作的执行速度。
变速动作主要分为2大类:Speed和ActionEase。
一.Speed
用于线性地改变某个动作的速度,也就是说成倍数的改变某动作的整体速度。Speed相当于一个包装器,将需要改变速度的动作包装到其中。
Speed类源码可以在CCAction类中看到:
class CC_DLL Speed : public Action { ...... static Speed* create(ActionInterval* action, float speed); inline float getSpeed(void) const { return _speed; } inline void setSpeed(float speed) { _speed = speed; } ...... }
可以看到,Speed类是直接继承自Action类的。其create()方法接收2个参数,第一个是其要包装的动作,必须是ActionInterval类型的动作,即简单的持续动作或复合动作,不可以是即时动作;第二个参数是一个float类型的速度值speed,这个speed就是该方法要包装的动作原来执行速度的倍数,比如speed=0.5,代表包装后速度变为原来的0.5倍,speed=2,代表包装后速度是原来速度的2倍。
举个栗子:
//创建一个sprite auto sprite = Sprite::create("haha.jpg"); //添加 this->addChild(sprite); //创建MoveTo动作 auto _moveTo = MoveTo::create(3.0,Vec2(920,320)); //创建Speed变速动作 //参数:1.动作 2.所包装动作原来速度的倍数 auto _speed = Speed::create(_moveTo,2); //执行动作 sprite->runAction(_speed);
二.ActionEase
Speed虽然能改变动作的速度,但只能按比例改变速度。ActionEase可以实现动作的速度由快到慢、速度随时间改变的运动。该类包含好多种类的缓冲运动:指数缓冲、正弦缓冲、弹性缓冲、跳跃缓冲和回震缓冲等等。每类缓冲运动基本都包含3个不同时期的变换:In、Out和InOut,这3个变换有是什么呢?简单来说,In是在运动起始时加速,Out是在运动快结束时减速,InOut包含两者,就是先加速后减速。
我们可以先看一下ActionEase类的源码:
class CC_DLL ActionEase : public ActionInterval
这句声明可以看到,ActionEase类是继承自ActionInterval类,所以它也是一种持续动作。
下面是所有种类缓冲运动的声明:
//指数缓冲 class CC_DLL EaseExponentialIn : public ActionEase class CC_DLL EaseExponentialOut : public ActionEase class CC_DLL EaseExponentialInOut : public ActionEase //正弦缓冲 class CC_DLL EaseSineIn : public ActionEase class CC_DLL EaseSineOut : public ActionEase class CC_DLL EaseSineInOut : public ActionEase //弹性缓冲 class CC_DLL EaseElastic : public ActionEase class CC_DLL EaseElasticIn : public EaseElastic class CC_DLL EaseElasticOut : public EaseElastic class CC_DLL EaseElasticInOut : public EaseElastic //跳跃缓冲 class CC_DLL EaseBounce : public ActionEase class CC_DLL EaseBounceIn : public EaseBounce class CC_DLL EaseBounceOut : public EaseBounce class CC_DLL EaseBounceInOut : public EaseBounce //回震缓冲 class CC_DLL EaseBackIn : public ActionEase class CC_DLL EaseBackOut : public ActionEase class CC_DLL EaseBackInOut : public ActionEase //贝塞尔缓冲 class CC_DLL EaseBezierAction : public ActionEase //二次缓冲 class CC_DLL EaseQuadraticActionIn : public ActionEase class CC_DLL EaseQuadraticActionOut : public ActionEase class CC_DLL EaseQuadraticActionInOut : public ActionEase //四次缓冲 class CC_DLL EaseQuarticActionIn : public ActionEase class CC_DLL EaseQuarticActionOut : public ActionEase class CC_DLL EaseQuarticActionInOut : public ActionEase //五次缓冲 class CC_DLL EaseQuinticActionIn : public ActionEase class CC_DLL EaseQuinticActionOut : public ActionEase class CC_DLL EaseQuinticActionInOut : public ActionEase //循环缓冲 class CC_DLL EaseCircleActionIn : public ActionEase class CC_DLL EaseCircleActionOut : public ActionEase class CC_DLL EaseCircleActionInOut:public ActionEase //立方缓冲 class CC_DLL EaseCubicActionIn:public ActionEase class CC_DLL EaseCubicActionOut : public ActionEase class CC_DLL EaseCubicActionInOut : public ActionEase
可以看出,ActionEase类提供了的各种缓冲方式的子类,每一种缓冲方式(贝塞尔缓冲除外)基本都分为In、Out和InOut三种不同时期的变换。
下面来举个使用ActionEase的栗子:
//创建一个sprite auto sprite = Sprite::create("haha.jpg"); //添加 this->addChild(sprite); //创建MoveTo动作 auto _moveTo = MoveTo::create(3.0,Vec2(920,320)); //创建正弦缓冲动作 auto _sineEase = EaseSineInOut::create(_moveTo); //执行动作 sprite->runAction(_sineEase);
其他缓冲类型的动作的使用方法也都与上面的例子一样,只是函数名不同。话说我试了好几种,觉得这么多种类的运动方式还真看不出来太大的区别,反正我觉得看起来都差不多O(∩_∩)O哈哈~。
以上。