2017-02-13 4 views
1

Je code un jeu en flash AS3 et j'ai implémenté ma boucle de jeu en utilisant la réponse fournie ici: Is this a good implementation of the gameloop Cependant, après avoir augmenté la position de mon MovieClip par dist (dist à partir de la vitesse * timeElapsed), la position y du MovieClip devient négative. J'ai remarqué cette valeur négative en traçant la position de movieclips à chaque mise à jour.La position de MovieClip Y devient négative sur la boucle de mise à jour en utilisant le delta

Code Voir:

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

    } 

Je voudrais savoir ce qui est à l'origine de cette valeur négative soudaine de MovieClips position y.

+0

Ne comptez jamais que l'heure locale ne peut aller de l'avant. Pas même 'flash.utils.getTimer' peut être simple. Vérifiez également si votre vitesse n'est pas négative quelque part. EDIT: Vous devez initialiser 'private var _lastTime: Number = 0;' avec une valeur correcte avant de commencer la boucle de jeu, sinon vous obtenez le premier incrément comme valeur TRES étrange. – Vesper

+0

Salut, quand je trace la valeur delta, elle est toujours positive et aussi la dist distante dans chaque boucle. – dawyda254

Répondre

0

Ouais comme @Vesper suggéré, j'ai trouvé que le problème est la première valeur delta qui est très grande car _lastTime est zéro. La solution est d'obtenir l'heure actuelle avant que la boucle commence (avant d'ajouter écouteur d'événement sur scène) et l'utiliser comme lastTime dans la première mise à jour à savoir

....

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

De cette façon, le premier _deltaTime est si petit proche de zéro donc dist sera zéro ce qui est exactement vrai puisque le point de départ des objets est 0 par rapport à lui-même.