2010-08-19 1 views
0

У меня есть функция с запуском Enter_Frame и ее анимация во время функции. Я знаю, что вы можете использовать object.y = object.y + 1 вместо TweenLite, который я использую сейчас. Но TweenLite дает лучший эффект, который я хотел. Моя проблема заключается в том, что я хотел удалить функцию enter_frame, когда она не сталкивается друг с другом. Но когда я прослеживал hitTestObject, он имеет долю секунды, где результат hitTestObject возвращает «false». Таким образом, tweening не может закончить 1-й и удалить run_frame раньше, пока объект все еще сталкивается.Enter Frame не обнаруживает hitTestObject точно, когда 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])); 
       } 
      } 
     } 

ответ

0

Ваша проблема заключается в том, что подростки не заканчиваются до 0,2 с после вызова метода checkCollision.

Если вы вызываете этот метод в файле ENTER_FRAME, вы будете постоянно переписывать существующие твины. Просто подумайте об этом - ENTER_FRAME вызовет checkCollisions, checkCollisions запустит некоторые подростки, прежде чем подростки успеют закончить, запускается следующий ENTER_FRAME, снова вызывает checkCollials и запускает tweens на тех же объектах, так как подростки еще не закончили повторное позиционирование объектов.

Лучше бы не использовать ENTER_FRAME вообще - запустить checkCollisions, запустите анимацию для пересекающихся объектов, если есть пересекающиеся объекты затем вызвать chechCollisions снова на 0,2 секунды позже (после того, как подростки закончили)

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 , Оно работает. Но анимация лучше всего проявляется в условии Enter_Frame, поэтому я меняю частоту кадров на 0. Но при условии, что условие «CollisionsDetected» работает отлично, я мог бы запустить другую функцию после окончания столкновения. – Hwang