Обнаружение столкновений во Flash ... или лучший способ сделать это - PullRequest
0 голосов
/ 04 января 2011

Я пытаюсь создать игру по воздушному хоккею во флэш-памяти с использованием AS3.

В данный момент я использую функцию ввода кадра, чтобы проверить расположение 3 объектов, 2 весла и мяча, затем он проверяет, находятся ли они в контакте, если это так, то запускает функцию обнаружения столкновения .

Однако он проверяет каждый раз при загрузке кадра, и при 25 кадрах в секунду это довольно много, и приложение отстает.

Какие-нибудь идеи или лучшие способы сделать это?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 04 января 2011

Вы пробовали таймер?

var timer:Timer = new Timer(250); // 4 times a second

timer.addEventListener(TimerEvent.TIMER, onTimer);
timer.start();


private function onTimer(ev:TimerEvent):void
{
  checkCollision();
}
1 голос
/ 05 января 2011

Два утверждения Пифагора замедляют вашу игру? На 25fps? Что-то не так - это должно быть , а не .

Полностью удалите обнаружение столкновений и убедитесь, что вы получаете 25fps обратно, затем добавляйте операторы по одной строке, пока замедление не появится снова.

Убедитесь, что вы не вызываете свой код коллизии более одного раза (ну, дважды) за кадр.

Помните, что вы можете проверить на столкновение без использования Math.sqrt:

function circlesTouching(circle1:Point, circle1Radius:Number, circle2:Point, circle2Radius:Number):Boolean {
    var dx:Number = circle1.x - circle2.x;
    var dy:Number = circle1.y - circle2.y;
    var minDist:Number = circle1Radius + circle2Radius;
    return (dx*dx) + (dy*dy) < (minDist * minDist);
}

(Вам все еще понадобится sqrt для разрешения столкновения, но это должно быть довольно редко.)

Однако, по моему опыту, несмотря на то, что Math.sqrt - самая медленная часть Пифагора, он все еще достаточно быстр для управления двумя вызовами на кадр со скоростью 25 кадров в секунду. Похоже, что-то еще не так.

1 голос
/ 04 января 2011

Если вам нужно периодически что-то проверять, я думаю, что событие enterFrame - подходящий механизм для этого.

Вы не упоминаете, используете ли вы встроенные функции проверки попадания или нет, поэтому я решил упомянуть их: hitTestObject и hitTestPoint .

...