2017-02-13 19 views
1

Я кодирую игру во вспышке AS3, и я реализовал свой игровой цикл, используя приведенный здесь ответ: Is this a good implementation of the gameloop Однако после увеличения позиции y моего мувиклипа на dist (dist is от скорости * timeElapsed) положение y мувиклипа становится отрицательным. Я заметил это отрицательное значение, отслеживая позицию мувиклипов при каждом обновлении.Позиция MovieClip Y становится отрицательной в цикле обновления с использованием дельта-времени

См код:

public class GameWorld extends MovieClip { 

    var speed:Number = 250; 
    var balls:Array = []; 
    private var _lastTime:Number = 0; 

public function GameWorld() { 
    createballs(); 
    this.addEventListener(Event.ENTER_FRAME, loop); 
} 

     public function loop(e:Event):void 
     { 
      var now = new Date().getTime(); 
      var _delta = now - _lastTime; 
      _lastTime = now; 
      updateGameState(_delta/1000); 
     } 

     public function updateGameState(timeElapsed:Number):void 
     { 
      var dist:Number = speed * timeElapsed; 
      balls[0].y += dist; 
      trace(balls[0].y); 
     } 

     public function createballs():void 
     { 
      for(var i:int = 0; i < 1; i++) 
      { 
       var ball:Ball = new Ball(); 
       ball.y = 100; 
       ball.x = 100; 
       addChild(ball); 
       balls.push(ball); 
      } 
     } 

    } 

Я хотел бы знать, что является причиной этого внезапного отрицательного значения мувиклипов у позиции.

+0

Никогда не рассчитывайте, что местное время может идти только вперед. Даже 'flash.utils.getTimer' может быть простым. Также проверьте, не потеряла ли ваша 'скорость' где-то. EDIT: вы должны инициализировать 'private var _lastTime: Number = 0;' с правильным значением, прежде чем вы начнете цикл игры, иначе вы получите первый приращение как ОЧЕНЬ странное значение. – Vesper

+0

Привет, когда я отслеживаю значение дельта, он всегда положителен, а также var dist в каждом цикле. – dawyda254

ответ

0

Да, как предложено @Vesper, я обнаружил, что проблема является первым значением дельта, которое очень велико, поскольку _lastTime равно нулю. Решение состоит в том, чтобы получить текущее время до начала цикла (перед добавлением слушателя событий на сцене) и использовать его в качестве LastTime в первом обновлении т.е.

....

_lastTime = new Date().getTime(); 
    //this is the looper function called on each frame 
    this.addEventListener(Event.ENTER_FRAME, _onEnterFrame); 
} 

public function _onEnterFrame(e:Event):void 
{ 
    var now = new Date().getTime(); 
    var _delta; 

    _delta = now - _lastTime; 
    _lastTime = now; 
    updateGameState(_delta/1000); 
} 

Таким образом, первый _deltaTime настолько мал близко к нулю, поэтому dist будет равен нулю, что в точности верно, так как начальная точка объектов равна 0 относительно самого себя.