2010-02-04 80 views
5

我明白爲什麼會這樣做,但我真的不知道如何防止這種情況。所以情景是,我每移動一幀汽車一定的預定義像素。發生什麼事情是,當我使用慢速或更快的計算機時......以及每秒獲得更少或更多的幀,以使車輛移動速度更慢或更快。我想知道如何防止這種情況。賽車遊戲,汽車在更快的電腦上移動速度更快

我懷疑我會用同樣的問題使用任何庫...這是我第一次做這樣的實時的東西。

+8

按下Turbo按鈕! –

+0

http://stackoverflow.com/questions/622604/best-approach-for-game-animation – Macke

回答

12

我懷疑你當前的代碼看起來莫名其妙地這樣

// to be called every frame 
void OnEveryFrame() 
{ 
    MoveCar(); 
    DrawCarToScreen(); 
} 

但它應該是這樣的:

// to be called - for example - 50 times per second: 
void OnEveryTimerEvent() 
{ 
    MoveCar(); 
} 

// to be called every frame 
void OnEveryFrame() 
{ 
    LockTimerEvents(); 
    DrawCarToScreen(); 
    UnlockAndProcessOutstandingTimerEvents(); 
} 

你必須建立一個根據計時器事件,當然。

10

根據定時器而不是車速移動車輛。即Car模型應該獨立於顯示錶示。

+0

如果我理解正確,計時器會計算每幀之間的時間嗎? – DogDog

+0

@阿波克,是的。如果你根據時間而不是幀速率進行遊戲,你將擁有更加一致的遊戲 – Polaris878

0

您必須在移動汽車和圖紙之前節省時間。
保存所有計算後的時間。
將您的車移動Npixels /秒

2

該運動應該受到「真實」時間延遲的限制,即您的汽車將以每個時間片x像素的速度移動。

2

閱讀實時時鐘,並在經過的時間內將汽車移動適當的距離。如果電腦速度太慢,這可能看起來有點「不穩定」,但會使車速與CPU速度無關。

3

你可以通過使用精確的定時器和向量數學來解決這個問題。

因此,爲了論證的緣故,我們建議您的繪圖代碼可以在任何時間點被調用,例如,相隔1秒或相隔3秒或相隔0.02秒。

以汽車運動速度爲每秒40像素。

因此,它應該移動的像素數量是(TIME_NOW - LAST_FRAME_TIME)* 40px。

2

您需要將幀率限制爲每秒X幀(最常見的60 FPS)。這是大多數多媒體框架中的一個常見功能,包括SFML。對於SFML,我會查看Window/RenderWindow方法SetFramerateLimit(unsigned int Limit)

+0

當幀速率低於60時,這並不能解決問題。 – DogDog

1

您需要fix your timestep。基本上,每次移動汽車的距離都會根據上次更新呼叫後實際經過的時間而變化。這樣,無論幀率如何,您都可以獲得正確的速度。