2017-02-13 34 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是完全對應的。