Ввод кадра не обнаруживает HitTestObject точно, когда анимация - PullRequest
0 голосов
/ 19 августа 2010

У меня есть функция с запущенным Enter_Frame, и она имеет анимацию во время функции. Я знаю, что вы можете использовать object.y = object.y + 1 вместо TweenLite, который я сейчас использую. Но TweenLite дает лучший эффект, который я хотел. Моя проблема сейчас в том, что я хотел удалить функцию enter_frame, когда она не сталкивается друг с другом. Но когда я отслеживал hitTestObject, у него была доля секунды, когда результат hitTestObject возвращал значение «false». Таким образом, анимация не может действительно закончить 1-е, и удалить enter_frame, запустив рано, пока объект все еще сталкивается.

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

1 Ответ

0 голосов
/ 20 августа 2010

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

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

Лучше всего вообще не использовать 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);
        }
...