2017-02-13 32 views
1

我在Flash AS3中编写游戏,并使用此处提供的答案实现了我的游戏循环:Is this a good implementation of the gameloop 但是,在通过dist增加我的movieclip的y位置后从速度* 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); 
      } 
     } 

    } 

我想知道是什么原因造成影片剪辑的这突如其来的负值y位置。

+0

绝不指望当地时间只能前进。甚至没有'flash.utils.getTimer'可以很简单。另外检查你的'速度'是否在某个地方不是负面的。编辑:你应该在开始游戏循环之前用正确的值初始化'private var _lastTime:Number = 0;',否则你会得到第一个非常奇怪的值。 – Vesper

+0

嗨,当我跟踪德尔塔值时,它总是正面的,以及每个循环中的var dist。 – dawyda254

回答

0

是的@Vesper建议,我发现这个问题是第一个非常大的delta值,因为_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是完全对应的。