變速動作和複合動作類似,也是一種特殊的動作,它可以把任何動作按照改變後的速度執行。變速動作與複合動作最大的區別就是複合動作只是單純的組合一系列動作,而變速的做在組合一系列動作後還要去改變動作的執行速度。
變速動作主要分爲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);
其他緩衝類型的動作的使用方法也都與上面的例子一樣,只是函數名不同。覺得這麼多種類的運動方式還真看不出來太大的區別
-------以下個人
這是存在問題的,有可能把速度減到爲負速,即跑過頭在往回跑
自己玩了下,貌似speed的動作加不到Sequence中去,如果有哪位知道指點下