CCEase動作緩衝的解析

在很多遊戲引擎中,都有各種各樣的動作,以及各色各樣的動作緩衝,以便達到不同的效果。

在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的倒數。


至於其他的緩衝函數,我就不一一列舉了,要寫自己的緩衝函數,必須先了解數學曲線哦。^_^






發佈了29 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章