2013-02-21 104 views
2

我已經在Flash/Actionscript/Starling中實現了一個gameloop,我想把它扔給你看看這是否是一個有效的實現。 我想有一個可變的時間步法。這是一個很好的實現gameloop

private var _deltaTime:Number = 0; 
private var _lastTime:Number = 0; 
private var _speed = 1000/40; 

private function onEnterFrame() { 
    var now = new Date().getTime(); 
    var delta = now - _lastTime; 
    _deltaTime += delta - _speed; 
    _lastTime = now; 

    //skip if frame rate to fast 
    if (_deltaTime <= -_speed) { 
     _deltaTime += _speed; 
     return; 
    } 
    update(); 
} 

private function update() { 
    updateGameState(); 

    if (_deltaTime >= _speed) { 
     _deltaTime -= _speed; 
     update(); 
    } 
} 

我得到的是我有一個恆定的速度(或多或少)。

我的問題是有更好的方法,使運動會出現即使 更順暢。

我真的很驚訝的是,即使你的FPS幾乎是恆定的(60FPS) 這個運動有時比起樸素的gameloop來說是顛簸平順的。

+0

不要創建新的日期各一次。我認爲應該有一個靜態函數。 – 2013-11-27 06:55:51

回答

4

你就是正確的軌道上 - 假設的onEnterFrame觸發由Event.ENTER_FRAME某種方式 - 而不是跳過更新,把它的每一幀上,但傳中,經過時間:

private function onEnterFrame() { 
    var now = new Date().getTime(); 
    var delta = now - _lastTime; 
    _lastTime = now; 
    updateGameState(delta/1000);//divide by 1000 to give time in seconds 
} 

在updateGameState,你可以利用'delta'來計算移動等,例如:

function updateGameState(timeElapsed:Number):void { 
    myAlien.x += myAlienSpeedPerSecond*timeElapsed; 
} 

這樣,即使幀頻變化,也可以獲得平滑的移動。

+0

爲什麼我應該在更新方法中用已經過的時間做什麼? – robkuz 2013-02-21 19:59:13

+0

對不起,在我完成之前意外地保存了答案。現在更有意義了嗎? – 2013-02-21 20:00:04

+0

是& no ; - ) 我真的很難得到我的頭像是如何移動一個像素的一小部分。通常我每25毫秒移動我的球員字符2像素。以及如何保持職位。 – robkuz 2013-02-21 20:07:09

相關問題