動畫是遊戲的必然要素之一,在整個遊戲過程當中,又有着加速、減速動畫的需求。以塔防爲例子,布塔的時候但願可以將遊戲減速,布好塔後,則但願能將遊戲加速;當某個怪被冰凍後,移動速度減緩,而其餘怪的移動速度不變。cocos2d-x引擎爲咱們提供了很強大的接口函數
1)實現全局的加速、減速。動畫
經過設置Scheduler的timeScale,能夠實現全局的加、減速。代碼很是簡單:spa
CCScheduler* pScheduler = CCDirector::sharedDirector()->getScheduler(); pScheduler->setTimeScale(2.0f); //實現加速效果 pScheduler->setTimeScale(0.5f);//實現減速效果
2)實現對某個CCActionInterval動做的加速、減速code
方法一:很容易想到的一個方法就是改變CCAnimation的delay unit。代碼以下:orm
AnimationCache* cache = CCAnimationCache::sharedAnimationCache(); CCAnimation* pAnimation = cache->animationByName(「xxx」); pAnimation->setDelayUnit(pAnimation->getDelayUnit()*0.2f); //速度爲原來的5倍
這個方法有一個缺點:改變了CCAnimationCache中這個animation的delay unit。也就是說之後即便再從CCAnimationCache中獲取這個animation,其delay unit已是原來的0.2倍了。對象
方法二:cocos2d-x提供了CCSpeed的類,能夠實現動畫速度的調節。用法以下:接口
CCActionInterval* act= CCMoveTo::create(5.0f, ccp(500.0f, 100.0f)); CCSpeed* pSpeed = CCSpeed::create(act, 1.5f); //1.5倍速運行 CCSpeed* pSpeed1 = CCSpeed::create(act, 0.2f);//0.2倍速運行 pSprite->runAction(pSpeed);
注意,若是pSprite有已經運行的動做,要用pSprite->stopActionByTag()停掉以前的動做,否則兩個動做就疊加到一塊兒了。遊戲
3)對某個CCFiniteTimeAction類型動做的加速、減速get
大部分時候,一個遊戲人物的動做並不是由單一一個CCActionInterval類型的動做構成,而是一串動做連起來,構成一個Sequence。 用CCSequence::create(…)建立的對象都是CCFinteTimeAction類型的,CCSpeed並不適用。在CCSpeed類的說明裏,明確指 出」This action can’t be Sequenceable because it is not an CCIntervalAction」。 那對於Sequence就一籌莫展了嗎?非也。cocos2d-x引擎自帶例子中,schedulerTest給咱們展現瞭如何控制某個sprite的 scheduler的timescaleanimation
在class TwoSchedulers中定義了兩個customer的scheduler和兩個CCActionManager。
CCScheduler *sched1; CCScheduler *sched2; CCActionManager *actionManager1; CCActionManager *actionManager2;
//在onEnter函數中,分別對兩個sprite設置customer的ActionManager.
CCScheduler *defaultScheduler = CCDirector::sharedDirector()->getScheduler(); // Create a new scheduler, and link it to the main scheduler sched1 = new CCScheduler(); defaultScheduler->scheduleUpdateForTarget(sched1, 0, false); // Create a new ActionManager, and link it to the new scheudler actionManager1 = new CCActionManager(); sched1->scheduleUpdateForTarget(actionManager1, 0, false); // Replace the default ActionManager with the new one. pSprite1->setActionManager(actionManager1);
經過以上的代碼,就能夠經過改變sched1的timescale來改變pSprite1的動做的快慢了。有了這種方法,那麼就能夠放棄CCSpeed的那種方法了。