2

私は Flash/Actionscript/Starling でゲームループを実装しました。これが有効な実装かどうかを確認するために投げたいと思います。可変時間ステップアプローチが必要でした。

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) であっても、単純なゲームループよりも動きがでこぼこしていることがありますが、滑らかであることです。

4

2 に答える 2

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 では、「デルタ」を利用して動きなどを計算できます。

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

これにより、フレーム レートが変化しても滑らかな動きが得られます。

于 2013-02-21T19:50:27.923 に答える