2013-05-30 4 views
0

У меня проблема с игрой, которую я делаю. У меня в основном есть объекты, которые находятся на карте, и я должен проверять каждую из них, если они сталкиваются со стенами (а затем делают что-то). Поскольку я работал с AS2, я думал о том, как сделать то же самое: я рисовал картину только с стенами, поэтому только прямоугольники и все остальное между ними прозрачно (не существует, а затем пол, например). В AS2 я помещал изображение на экран, назовем его стеной, а затем я сделал hitTest на стене с каждым объектом. Это, например, объект был на самом деле на изображении, так как прозрачные части были его частью, но функция проверялась только на видимые части, а значит и на стенах. Так оно и работало.Эффективное обнаружение столкновений в AS3

Сейчас в AS3 нет HitTest, но hitTestObject, который я использовал, и я делаю например wall.hitTestObject(object). Проблема в том, что эта функция выглядит так, как будто она не видит прозрачные пленки, а объекты, не касаясь стен, сталкиваются с ними!

Я нашел PixelPerfectCollisionDetection, что на самом деле решает проблему, но она огромна и тяжела, поэтому в моем случае с таким количеством объектов, которые будут проверяться (по крайней мере 60) на каждом кадре, игра замедляет много!

Мне нужна функция, такая как hitTestObject (мне не нужна большая точность!), Которые заботятся о прозрачных частях изображения.

Как я могу это сделать?

+0

В AS3 есть библиотеки высокой производительности, которые можно использовать как Box2D. – Marty

+0

вы можете попытаться оптимизировать свое обнаружение столкновения - например: проверьте, чтобы 2 объекта находились на подходящем расстоянии друг от друга, прежде чем использовать (медленный) hitTestObject. –

ответ

2

Как уже упоминалось в комментариях, библиотеки физики/игры будут иметь этот код для вас и должны работать из коробки.

Но если вы хотите построить его самостоятельно, или даже ввести свои собственные оптимизации, то первый шаг (который очень недорог) проверяет наличие ограничивающего столкновения с использованием полностью встроенная функциональностью DisplayObject.getBounds и Rectangle.intersects (хотя вы должны сделать так, в последовательном координатном пространстве, т.е. стадии):

if (obj1.getBounds(stage).intersects(obj2.getBounds(stage)) { 
    // Cheap bounds intersection is true, now do pixel-perfect detection... 
} 

Тогда, если границы проверить верно, выполнять обнаружение столкновений с точностью до пиксела.

Кажется, что BitmapData.hitTest - ваш лучший выбор - см. blog post by Mike Chambers.

До этого метода, если вы заинтересованы в опрятных приемах, был метод, описанный Грантом Скиннером в his blog. Это довольно умный алгоритм, использующий встроенные подпрограммы bitmap (ака, довольно быстро), создавая BitmapData размером с перекрывающуюся область (или даже масштабируя ее вниз) и вытягивая два объекта в определенные каналы битмапдата, а затем используя BitmapData.getColorBoundsRect(), чтобы определить, есть ли какие-либо пиксели. Я предполагаю, что BitmapData.hitTest быстрее, но было бы интересно сравнить.

+0

Это сработало! И это быстрее, чем pixelperfect! – Maloooo

1

Я столкнулся с той же проблемой, и, честно говоря, я нашел простой способ избавиться от этого, просто создав слой «маска» для столкновений. Вы всегда можете разместить это под своим фоном, чтобы он не отображался, или не меняйте прозрачные пленки и что бы то ни было. Сделайте это во Flash, а после «накрытия» прямоугольниками (или как-нибудь) столкновениями просто выберите их все и сделайте это клип.

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

Для меня это работало нормально.

Смежные вопросы