2010-03-21 94 views
3

我在做一個小小的iphone遊戲,我會得到一些線索。 讓我們想象一下:用Cocos2D製作動畫的好方法?

兩個背景精靈從右到左相當快速移動,並和上下移動與加速度計。

我想我不能在這裏使用動畫,使背景的運動在每一幀被重新計算。 於是我就用一個時間表與0.025s的間隔,並在每個時鐘移動我的精靈有:

sprite.position = ccp(x, y); 

因此,這裏是我的問題:結果是laggy,只有這兩個精靈。

我試圖在頭兩個聲明的精靈,並讓他們與CCNodes和標籤。這是完全一樣的。

所以,如果有人可以給我什麼是做到這一點的最好辦法一個提示,那將是多好啊。我不知道這個問題是不是精子移動速度非常快的事實,但我不確定。

無論如何,謝謝你的時間。

J.

回答

3

0.025等於40幀,這可能是取決於你的遊戲循環的其餘部分有點陡峭。考慮幀率和流暢速度之間的關係是很好的。當你增加幀率時,你可以使運動更平滑,但只要你知道如何計算運動。如果將對象移動一段固定距離的時間,他們會口吃,因爲定時器不精確。 (想一想:40 fps意味着每幀25 ms,當定時器下降5毫秒時 - 不是很多,是嗎? - 將幀時間改爲20%。時間事件並不常見關閉10-20毫秒)。

這意味着你要計算從最後一幀的實時增量,並根據其移動的對象。像這樣的位:

const int kDesiredModelFramerate = 50; // fps 
const double kDesiredFrameTime = 1.0/kDesiredModelFramerate; 

double now = CFAbsoluteTimeGetCurrent(); 
double delta = now - lastFrameTime; 
double correction = delta/kDesiredFrameTime; 
[object setX:object.x + step*correction]; 

這看起來很複雜,但並非如此。當從最後一幀開始需要40毫秒時,由於保持50幀/秒的期望幀率,您希望每幀保持在20毫秒以下,所以您知道自己是一幀「遲到」。因此,correction將爲0.04/0.02 = 2,通常的移動步驟將乘以2來彌補滯後。現在您可以根據需要更改幀速率 - 運動的速度將保持不變,只有運動的平滑度會發生變化。

<voice class="Simon Peyton Jones">這有道理嗎? </voice>

有一個great article about game loops你可以在這裏更詳細地閱讀。這是遊戲程序員必讀的內容。在Cocos2D中實現所有這些的確切方法可能會有所不同,但重點仍然相同。解決這個問題應該可以幫助你讓事情平穩快速地進行。

+0

很好的 「滴答」 功能的變化。你明確了自己,我現在看到了我必須領導的地方。 這篇文章確實非常有用。 謝謝! – 2010-03-22 01:57:02

1

如果您正在使用Cocos2D中,需要從「遊戲」開始發現經過的時間,最好是使用TIME_ELAPSED,如下圖所示。我嘗試過的許多其他方法會返回一個非常高值的DOUBLE變量,這會導致雙精度浮點轉換精度中出現更多問題。

請在cocos2d的CCLayer場景

-(void) tick: (ccTime) dt 
{ 
    static float time_elapsed = 0.0; 
    time_elapsed += dt; 

    ... 

    float velocity = 5.0f * cosf(time_elapsed * 2 * M_PI) ; 
    jPrism->SetMotorSpeed(velocity); 
}