2010-08-19 4 views
0

J'ai une fonction avec Enter_Frame en cours d'exécution et l'ai tween pendant la fonction. Je sais que vous pouvez utiliser object.y = object.y + 1 au lieu de TweenLite que j'utilise maintenant. Mais TweenLite donne le meilleur effet que je voulais. Mon problème est maintenant, je voulais enlever la fonction enter_frame quand elle ne se heurte pas. Mais quand j'ai tracé hitTestObject, il a comme une fraction de seconde où le résultat hitTestObject renvoie 'false'. Ainsi, l'interpolation ne peut pas vraiment finir en 1ère, et supprimer enter_frame en cours d'exécution alors que l'objet est encore en collision.Enter Frame ne détecte pas hitTestObject précisément lorsque tweenling

private function checkCollision (e:Event):void 
     { 
      //detect collision in array 
      for (var j:uint = 0; j < collisionArray.length - 1; j++) 
      { 
       for (var k:uint = j + 1; k < collisionArray.length; k++) 
       { 
        if (collisionArray[j].hitTestObject(collisionArray[k])) 
        { 
         //do something 
         TweenLite.to (objectA,0.2,{y:move2Y}); 
         TweenLite.to (objectB,0.2,{y:move3Y}); 
        } 
        trace (collisionArray[j].hitTestObject(collisionArray[k])); 
       } 
      } 
     } 

Répondre

0

Votre problème est que les interpolations ne se terminent pas avant 0,2 seconde après l'appel de la méthode checkCollision.

Si vous appelez cette méthode dans ENTER_FRAME, vous écraserez constamment les interpolations existantes. Il suffit de penser à cela - ENTER_FRAME appelle checkCollisions, checkCollisions va commencer quelques tweens, avant que les tweens aient le temps de terminer, le prochain ENTER_FRAME se déclenche, appelle à nouveau checkCollisions et démarre tweens sur les mêmes objets, puisque les tweens n'ont pas fini de repositionner le objets encore.

Votre meilleur pari peut-être de ne pas utiliser ENTER_FRAME du tout - courir checkCollisions, commencer préadolescents pour les objets d'intersection, si des objets se croisent alors appeler chechCollisions à nouveau 0,2 secondes plus tard (une fois que les pré-adolescents fini)

private function checkCollision (e:Event):void 
     { 
      var collisionsDetected:Boolean = false; 
      //detect collision in array 
      for (var j:uint = 0; j < collisionArray.length - 1; j++) 
      { 
       for (var k:uint = j + 1; k < collisionArray.length; k++) 
       { 
        if (collisionArray[j].hitTestObject(collisionArray[k])) 
        { 
         //do something 
         TweenLite.to (objectA,0.2,{y:move2Y}); 
         TweenLite.to (objectB,0.2,{y:move3Y}); 
         collisionsDetected = true; 
        } 
        trace (collisionArray[j].hitTestObject(collisionArray[k])); 
       } 
      } 

      //you might want to make the timeout a little longer than 200ms, 
      //to make sure that the tweens have completed when it fires. 
      //you can figure out the best delay based on your framerate 
      if(collisionsDetected) setTimeout(checkCollision, 250); 
     } 
+0

Thanx . Ça marche. Mais les animations s'affichent le mieux en condition Enter_Frame, donc je change le framerate à 0. Mais avec la condition 'CollisionsDetected' fonctionnant parfaitement, je pourrais réussir à exécuter une autre fonction après la fin de la collision. – Hwang

Questions connexes