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

Posted

技术标签:

【中文标题】MovieClip Y 位置在使用增量时间的更新循环上变为负数【英文标题】:MovieClip Y position becomes negative on update loop using delta time 【发布时间】:2017-07-01 08:53:08 【问题描述】:

我正在用 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);
            
        

    

我想知道是什么导致了movieclips y位置突然出现负值。

【问题讨论】:

永远不要算本地时间只能往前走。甚至flash.utils.getTimer 也不能直截了当。还要检查您的speed 是否在某处没有得到否定。编辑:您应该在开始游戏循环之前使用正确的值初始化 private var _lastTime:Number = 0;,否则您将获得第一个增量作为非常奇怪的值。 嗨,当我跟踪 delta 值时,它始终为正,每个循环中的 var dist 也是如此。 【参考方案1】:

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

【讨论】:

以上是关于MovieClip Y 位置在使用增量时间的更新循环上变为负数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AS3 使 scrollPane 内的 MovieClip 移动到新位置?

使用Redis SortedSet实现增量更新

Mysql的增量备份 及基于时间点与位置的恢复

用另一个 MovieClip 更改一个 MovieClip 的简单方法

KETTLE如何实现实时的增量更新

如何在 Adob​​e Flash CS3 中移动 MovieClip 的原点?