2013-02-21 74 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

相关问题