Actionscript 3 使用增量时间更新循环时,MovieClip Y位置变为负值

Actionscript 3 使用增量时间更新循环时,MovieClip Y位置变为负值,actionscript-3,flash-cs5,flash,Actionscript 3,Flash Cs5,Flash,我正在用flash AS3编写一个游戏,并使用此处提供的答案实现了我的游戏循环: 但是,将我的movieclip的y位置增加dist(dist是从speed*timeappeased开始的)后,movieclip的y位置变为负值。 通过跟踪每次更新时movieclips的位置,我注意到了这个负值 见代码: public class GameWorld extends MovieClip { var speed:Number = 250; var balls:Array = []

我正在用flash AS3编写一个游戏,并使用此处提供的答案实现了我的游戏循环: 但是,将我的movieclip的y位置增加dist(dist是从speed*timeappeased开始的)后,movieclip的y位置变为负值。 通过跟踪每次更新时movieclips的位置,我注意到了这个负值

见代码:

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);
            }
        }

    }
公共类游戏世界扩展MovieClip{
无功转速:数=250;
变量:数组=[];
私有变量_lastTime:Number=0;
公共功能游戏世界(){
createballs();
this.addEventListener(Event.ENTER_FRAME,循环);
}
公共函数循环(e:事件):无效
{
var now=new Date().getTime();
var _delta=now-_lastTime;
_上次=现在;
更新平均值(_delta/1000);
}
公共函数updateGameState(timeappeased:Number):无效
{
var dist:数字=速度*经过的时间;
球[0]。y+=dist;
轨迹(球[0].y);
}
公共函数createballs():void
{
对于(变量i:int=0;i<1;i++)
{
变量ball:ball=新的ball();
球y=100;
球x=100;
addChild(ball);
推(球);
}
}
}

我想知道是什么原因导致了moviecY位置突然出现负值。

是的,正如@Vesper所建议的,我发现问题是第一个delta值,它非常大,因为_lastTime为零。解决方案是获取循环开始之前的当前时间(在阶段上添加事件侦听器之前),并将其用作第一次更新的最后时间,即


这样一来,第一个增量时间非常小,非常接近于零,因此距离将为零,这是完全正确的,因为对象的起点相对于自身为0。

是的,正如@Vesper所建议的,我发现问题是第一个增量值,它非常大,因为“lastTime”为零。解决方案是获取循环开始之前的当前时间(在阶段上添加事件侦听器之前),并将其用作第一次更新的最后时间,即


这样一来,第一个deltaTime非常小,接近于零,因此dist将为零,这完全正确,因为对象的起点相对于自身为0。

永远不要计算本地时间只能向前。甚至
flash.utils.getTimer
也不能简单明了。还要检查您的
速度是否在某个地方为负值。编辑:您应该初始化
private var\u lastTime:Number=0在开始游戏循环之前使用正确的值,否则你会得到第一个增量作为非常奇怪的值。嗨,当我跟踪增量值时,它总是正值,并且每个循环中的var dist都是正值。永远不要计算本地时间只能向前。甚至
flash.utils.getTimer
也不能简单明了。还要检查您的
速度是否在某个地方为负值。编辑:您应该初始化
private var\u lastTime:Number=0在开始游戏循环之前使用正确的值,否则会得到第一个增量作为非常奇怪的值。嗨,当我跟踪增量值时,它总是正值,并且每个循环中的var dist也是正值。
    _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);
}