Cocos2d-x 動作之變速動作

大部分動作的變化過程是與時間成線性關係的,即一個動作經過相同時間產生的變化相同,例如,CCMoveBy會使節點在同樣長的時間內經過同樣的位移。這是因爲Cocos2d-x把動作的速度變化控制抽離了出來,形成一個獨立的機制。藉助這個機制,我們可以很方便地實現諸如魚的變速遊動、金幣的加速飛行以及後面將要介紹的動作平滑化等效果。普通動作配合變速動作,可以構造出很有趣的動作效果。

與複合動作類似,變速動作也是一種特殊的動作,它可以把任何一種動作按照改變後的速度執行。因此,在初始化變速動作時,需要傳入一個動作。

變速動作包括CCSpeed動作與CCEase系列動作,下面我們詳細介紹這些動作。

1. CCSpeed

CCSpeed用於線性地改變某個動作的速度,因此,可以實現成倍地快放或慢放功能。爲了改變一個動作的速度,首先需要將目標動作包裝到CCSpeed動作中:

CCRepeatForever* repeat = CCRepeatForever::create(animation);
CCSpeed* speed = CCSpeed::create(repeat, 1.0f);
speed->setTag(action_speed_tag);
fish->runAction(speed);

在上面的代碼中,我們創建了一個animation動作的CCRepeatForever複合動作repeat,使動畫被不斷地重複執行。然後,我們又使用repeat動作創建了一個CCSpeed變速動作。create初始化方法中的兩個參數分別爲目標動作與變速比率。設置變速比率爲1,目標動作的速度將不會改變。最後,我們爲speed動作設置了一個tag屬性,並把動作交給fish精靈,讓精靈執行變速動作。此處設置的tag屬性與CCNodetag屬性類似,用於從節點中方便地查找動作。

接下來,在需要改變速度的地方,我們通過修改變速動作的speed屬性來改變動作速度。下面的代碼將會把上面設置的動畫速度變爲原來的兩倍:

CCSpeed * speed = fish->getActionByTag(action_speed_tag);
speed->setSpeed(2.0f);

2. CCActionEase

雖然使用CCSpeed能夠改變動作的速度,然而它只能按比例改變目標動作的速度。如果我們要實現動作由快到慢、速度隨時間改變的變速運動,需要不停地修改它的speed屬性才能實現,顯然這是一個很煩瑣的方法。下面將要介紹的CCActionEase系列動作通過使用內置的多種自動速度變化來解決這一問題。

CCActionEase系列包含15個動作,它們可以被概括爲5類動作:指數緩衝、Sine緩衝、彈性緩衝、跳躍緩衝和回震緩衝。每一類動作都有3個不同時期的變換:In、Out和InOut。下面使用時間變換圖像表示每組CCActionEase動作的作用效果,其中橫座標表示實際動畫時間,縱座標表示變換後的動畫時間。因此,線性動作的圖像應該是一條自左下角到右上角的直線。圖4-3展示了Cocos2d-x的各種變速曲線。

指數緩衝:

enter image description here[+]查看原圖

(a)easeInExpo (b)easeOutExpo (c)easeInOutExpo

Sine緩衝:

enter image description here[+]查看原圖

(a)easeInSine (b)easeOutSine (c)easeInOutSine

彈性緩衝:

enter image description here[+]查看原圖

(a)easeInElastic (b)easeOutElastic (c)easeInOutElastic

跳躍緩衝:

enter image description here[+]查看原圖

(a)easeInBounce (b)easeOutBounce (c)easeInOutBounce

回震緩衝:

enter image description here[+]查看原圖

(a)easeInBack (b)easeOutBack (c)easeInOutBack

圖4-3 變速動作曲線

CCActionEase的使用方法與CCSpeed類似。以Sine緩衝爲例,以下代碼實現了InSine變速運動:

CCEaseSineIn* sineIn = CCEaseSineIn::create(action);
sineIn->setTag(action_sine_in_tag);
fish->runAction(sineIn);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章