MovieClip Y 位置在使用增量时间的更新循环中变为负数

MovieClip Y position becomes negative on update loop using delta time

我正在用 Flash AS3 编写游戏代码,我已经使用此处提供的答案实现了我的游戏循环:Is this a good implementation of the gameloop 但是,在将我的影片剪辑的 y 位置增加 dist(dist 来自速度 * timeElapsed)之后,影片剪辑的 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);
            }
        }

    }

我想知道是什么导致了影片剪辑 y 位置的突然负值。

是的,正如@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。