Проверка попадания на многие объекты Flash AS3

Я делаю симуляцию, в которой частицы динамически добавляются на сцену (много кругов). Когда эти круги сталкиваются (которые на самом деле являются мувиклипами), они должны отскакивать (импульс переключается). У меня нет проблем с физикой, но я не знаю, как эффективно проверять столкновения. Это сводится к возможности 1) проверить, сталкивается ли частица и 2) определить, какая другая частица (объект) участвует в столкновении?

В идеале я хотел бы, чтобы частицы могли проверять свои собственные столкновения и регулировать свой собственный импульс, а не просто какая-то мясистая Render() функция, работающая в каждом кадре. Как это можно сделать?

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


person James    schedule 24.11.2011    source источник


Ответы (4)


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

Реализация, однако, сложна, и если вы намеренно не ставите перед собой задачу, используйте библиотеку, чтобы не изобретать велосипед. Вы можете использовать Box2D, физический движок, или Flixel, игровой движок.

person Jamie    schedule 24.11.2011
comment
if(object.x+width › minX && object.x-width ‹ maxX && blah){ if(delides ‹ 15){ minX += (maxX - minX) / 2 } } не кажется сложным.. - person apscience; 25.11.2011

http://troygilbert.com/2009/08/pixel-perfect-collision-detection-revisited/

Это ссылка на класс as3, обеспечивающий Pixel-Perfect Collision Detection. Ссылка для скачивания указана на сайте. Надеюсь это поможет.

Автор также ссылается на другое решение:

http://coreyoneil.com/portfolio/index.php?project=5

person skibulk    schedule 24.11.2011

Если вы заботитесь о скорости и оптимизации, я бы посоветовал вам использовать Box2D. Есть много примеров для вас, чтобы начать работу, и делать то, что вы предлагаете, на самом деле довольно просто.

person felipemaia    schedule 24.11.2011
comment
Это выглядит как отличный вариант, если вы собираетесь использовать библиотеку. - person James; 25.11.2011
comment
Мой вам совет: не реализуйте самостоятельно что-то столь сложное, как физическое поведение и обнаружение коллизий, полагайтесь на проверенные, работающие оптимизированные библиотеки, которые использовались, оптимизировались и отлаживались большим количеством разработчиков. Кроме того, вы можете включить исходный код библиотеки в свой код, вам не нужно использовать swc или что-то еще. - person felipemaia; 25.11.2011
comment
Если бы у меня был контракт и т. Д., Я бы, конечно, сделал то, что вы предлагаете, однако я просто пытаюсь поиграть со вспышкой (установленной пару дней назад) и поэтому сознательно делаю все из первых принципов - мне не нужен результат. - person James; 26.11.2011

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

person user2956947    schedule 01.03.2014