原文http://blog.csdn.net/henren555/article/details/24244021
原做者:揚名天嚇php
動畫是遊戲的必然要素之一,在整個遊戲過程當中,又有着加速、減速動畫的需求。以塔防爲例子,布塔的時候但願可以將遊戲減速,布好塔後,則希 望能將遊戲加速;當某個怪被冰凍後,移動速度減緩,而其餘怪的移動速度不變。cocos2d-x引擎爲咱們提供了很強大的接口,下面就將我實驗的過程複述 一遍,也方便他人。
1)實現全局的加速、減速。
經過設置Scheduler的timeScale,能夠實現全局的加、減速。代碼很是簡單:
java
CCScheduler* pScheduler = CCDirector::sharedDirector()->getScheduler(); pScheduler->setTimeScale(2.0f); //實現加速效果 pScheduler->setTimeScale(0.5f);//實現減速效果
2)實現對某個CCActionInterval動做的加速、減速
方法一:很容易想到的一個方法就是改變CCAnimation的delay unit。代碼以下:
微信
CCAnimation* pAnimation = CCAnimationCache::sharedAnimationCache()->animationByName(「xxx」); pAnimation->setDelayUnit(pAnimation->getDelayUnit()*0.2f); //速度爲原來的5倍 這個方法有一個缺點:改變了CCAnimationCache中這個animation的delay unit。也就是說之後即便再從CCAnimationCache中獲取這個animation,其delay unit已是原來的0.2倍了。
方法二:cocos2d-x提供了CCSpeed的類,能夠實現動畫速度的調節。用法以下:
函數
CCActionInterval* pActionInterval = CCMoveTo::create(5.0f, ccp(500.0f, 100.0f)); CCSpeed* pSpeed= CCSpeed::create(pActionInterval, 1.5f); //1.5倍速運行 CCSpeed* pSpeed1 = CCSpeed::create(pActionInterval, 0.2f);// 0.2倍速運行 pSprite->runAction(pSpeed);
注意,若是pSprite有已經運行的動做,要用pSprite->stopActionByTag()停掉以前的動做,否則兩個動做就疊加到一塊兒了。動畫
—————————————————————–華麗麗的分割線————————————————————————–網站
來自HIMI的提示:.net
不少時候你的主角的動做利用CCAction來實現,移動則是在update刷幀函 數或者一些選擇器的方法中進行的,那麼爲了讓你的主角慢動做比較逼真,那麼Himi建議不要使用scheduleUpdate函數,由於這個你沒法修改每 次調用update的時間默認都是每幀都調用,那麼你應該本身定義一個選擇器當刷邏輯的函數,這樣就能配合CCSpeed實現逼真慢動做拉~
3)對某個CCFiniteTimeAction類型動做的加速、減速
大部分時候,一個遊戲人物的動做並不是由單一一個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的timescale。廢話少說,直接看代碼。
設計
在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的那種方法了。code
歡迎關注關東昇新浪微博@tony_關東昇。
關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息
更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php對象