在很多遊戲引擎中,都有各種各樣的動作,以及各色各樣的動作緩衝,以便達到不同的效果。
在cocos2d中,同樣也有這樣一大批動作緩衝類。
先讓我們分析下動作是如何運行的吧。
1、動作的要素
一般的動作至少有2個要素,一個是時間、一個是目的地,可能是位置(距離),也可能是其他屬性。
2、如果只考慮線性,不考慮緩衝,那麼基本的計算公式就是:
當前屬性 = 起始屬性 + 逝去時間*(目標屬性 - 起始屬性)/總時間
這個公式變化一下就是:
當前屬性 = 起始屬性 + 逝去時間/總時間 * (目標屬性-起始屬性)
3、比率
我們可以看出,以上的公式中,只有逝去時間是變化的,我們設
比率rate = 逝去時間/總時間
在計算機中,這個逝去時間基本是線性累加的,我們如果想做各種緩衝,只需要改變rate即可。
下面我們來看下cocos2d中的動作類關於變化部分是如何設計的:
動作基類CCActionInterval中,動作會首先調用
-(void) step: (ccTime) dt
{
if( firstTick_ ) {
firstTick_ = NO;
elapsed_ = 0;
} else
elapsed_ += dt;
[self update: MIN(1, elapsed_/duration_)];
}
然後調用
-(void) update: (ccTime) t。
從上面我們可以看出,update的參數其實是一個比例,就是已經逝去時間/總時間,而不是所謂的ccTime。
這裏之前我一直存在着誤解,以爲update中的t就像其他的update中的t一樣是 逝去時間,其實大錯特錯,這個只是個比例
這個參數其實應該改下名字,叫做rate更好一點,只能在0到1之間變化。
現在我們來看下CCMoveTo的update函數吧
-(void) update: (ccTime) t
{
[target_ setPosition: ccp( (startPosition.x + delta.x * t ), (startPosition.y + delta.y * t ) )];
}
其中,delta是屬性 位置之差,是不是和我們之前分析的一樣呢。
緩衝函數:
他們的功能很簡單,就是改變rate,讓我們來看下CCEaseIn
-(void) update: (ccTime) t
{
[other update: powf(t,rate)];
}
這個函數很簡單,就是將t替換成 t的rate次方,rate是可以設置的,其實就是一個冪函數,而起變化區間在0與1之間。我們來複習下中學的知識,看下冪函數的圖像吧:
在0到1區間,由於指數rate是大於1的,所以就是下面的那些曲線,變化先慢後快。
而CCEaseOut呢,
-(void) update: (ccTime) t
{
[other update: powf(t,1/rate)];
}
這個更簡單了,直接求個rate的倒數。
至於其他的緩衝函數,我就不一一列舉了,要寫自己的緩衝函數,必須先了解數學曲線哦。^_^