Cocos2d-x動畫加速與減速

動畫是遊戲的必然要素之一,在整個遊戲過程當中,又有着加速、減速動畫的需求。以塔防爲例子,布塔的時候但願可以將遊戲減速,布好塔後,則但願能將遊戲加速;當某個怪被冰凍後,移動速度減緩,而其餘怪的移動速度不變。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的那種方法了。

相關文章
相關標籤/搜索