大部分動作的變化過程是與時間成線性關係的,即一個動作經過相同時間產生的變化相同,例如,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
屬性與CCNode
的tag
屬性類似,用於從節點中方便地查找動作。
接下來,在需要改變速度的地方,我們通過修改變速動作的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的各種變速曲線。
指數緩衝:
(a)easeInExpo (b)easeOutExpo (c)easeInOutExpo
Sine緩衝:
(a)easeInSine (b)easeOutSine (c)easeInOutSine
彈性緩衝:
(a)easeInElastic (b)easeOutElastic (c)easeInOutElastic
跳躍緩衝:
(a)easeInBounce (b)easeOutBounce (c)easeInOutBounce
回震緩衝:
(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);