Enter Frame не определяет точно hitTestObject при анимации

У меня есть функция с запущенным 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]));
                }
            }
        }

person Hwang    schedule 19.08.2010    source источник


Ответы (1)


Ваша проблема в том, что анимация не заканчивается до 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);
        }
person Patrick P    schedule 19.08.2010
comment
Спасибо. Оно работает. Но анимация лучше всего показывается в условии Enter_Frame, поэтому я устанавливаю частоту кадров на 0. Но с условием CollisionsDetected, работающим отлично, я могу запускать другую функцию после окончания столкновения. - person Hwang; 20.08.2010