Лучший способ обнаружить столкновение между спрайтами?

Как лучше всего обнаруживать столкновения в спрайтах двухмерной игры? Сейчас я работаю над allegro и G ++


person Abhishek Mishra    schedule 19.09.2008    source источник
comment
Этот вопрос теперь о спрайтах.   -  person Chris Charabaruk    schedule 19.09.2008


Ответы (7)


Существует множество способов обнаружения столкновения. Методы, которые вы используете, будут немного изменены в зависимости от того, используете ли вы 2D или 3D среду. Также помните, что при установке системы обнаружения столкновений необходимо учитывать любую физику, которую вы можете захотеть реализовать в игре (необходимая для большинства спускаемых 3D-игр), чтобы улучшить ее реальность.

Краткий вариант - использовать ограничивающие рамки. Или, другими словами, сделайте каждую сущность в мире блоком, а затем проверьте, не сталкиваются ли каждая из осей блока с другими объектами.

При большом количестве объектов для проверки на столкновения вы можете проверить октодерево. Вы просто разделите мир на сектора, а затем проверяете столкновение только между объектами в одних и тех же секторах.

Для получения дополнительных ресурсов вы можете перейти на sourceforge и выполнить поиск движка динамики Bullet, который представляет собой движок обнаружения столкновений и физики с открытым исходным кодом, или вы можете проверить http://www.gamedev.net, на котором есть множество ресурсов по обширным темам разработки игр.

person cs_student    schedule 19.09.2008

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

Для Allegro существует Collegro. Для SDL существует SDL_Collide.h или SDL-Collide. Вы можете использовать I_COLLIDE с OpenGL. DarkBASIC имеет встроенную систему коллизий и DarkPhysics для очень точного взаимодействия, включая коллизии.

person Sparr    schedule 19.09.2008
comment
@Abhishek Mishra, возможно, вы захотите добавить это к своему вопросу, может быть, кто-то еще знает другое хорошее решение для вас. - person Huppie; 19.09.2008
comment
URL-адрес Collegro не работает, но вы можете найти ветку об этом здесь: allegro.cc/forums / thread / 550371 Также для Allegro используется PPCol. - person Stefan Hendriks; 07.12.2009

Используйте библиотеку, я рекомендую Box2D

person Niall    schedule 19.09.2008

Это довольно общий вопрос. Есть много способов обнаружить столкновения в 2D-игре. Было бы полезно узнать, что вы пытаетесь сделать.

Однако для начала существуют довольно простые методы, которые позволяют обнаруживать круги, прямоугольники и т. Д. Я не большой поклонник gamedev.net, но там есть несколько хороших ресурсов об этом типе обнаружения. Одна из таких статей находится здесь. В нем содержится базовый материал, который может помочь вам начать работу.

В простых 2D-играх можно использовать прямоугольники или круги, чтобы «заключить» объект на экране. Определение того, когда перекрываются прямоугольники или круги, является довольно простой математикой. Если вам нужно что-то более сложное (например, выпуклые произвольные многоугольники), то решение будет более сложным. Опять же, здесь может помочь gamedev.net.

Но на самом деле, чтобы ответить на ваш вопрос, нам нужно знать, что вы пытаетесь сделать? Какая игра? С какими типами объектов вы пытаетесь столкнуться? Вы пытаетесь столкнуться с границами экрана и т. Д.

person Mark    schedule 19.09.2008
comment
Я не большой поклонник gamedev.net. Я обычно сам не использую их обучающие программы. Тем не менее, форумы очень активны, поэтому вы можете поискать на форумах ссылки на хорошие места, где можно найти учебные пособия (за пределами разработки игр), а также конкретные вопросы. Я больше пытался увести его в правильном направлении. - person cs_student; 21.09.2008

Проверить столкновение двух мячей в 2D очень просто. Вы можете погуглить, но в основном вы проверяете, больше ли длина радиуса двух шаров вместе или равна расстоянию между центрами двух шаров.

Затем вы можете найти точку столкновения, взяв единичный вектор между центрами шаров и умножив его на один из радиусов шаров.

person Erik Engheim    schedule 27.04.2009

Внедрение системы обнаружения столкновений - сложный вопрос, но вы должны учитывать три момента.

  • Мир предметов. Разделение пространства. Если вы выполните проверку столкновений каждого двумерного спрайта в вашем мире со всем остальным, у вас будет медленная медленная программа! Вам нужно расставить приоритеты. Вам нужно разделить пространство. Вы можете использовать ортогональную сетку и разрезать свой мир на 2-мерную сетку. Или вы можете использовать дерево BSP, используя строки в качестве функции разделителя.

  • Обнаружение широких фазовых столкновений. При этом используются ограничивающие объемы, такие как цилиндры или эллипсы (в зависимости от того, что лучше всего соответствует форме ваших спрайтов), чтобы определить, стоит ли сравнивать объекты более подробно. Математика для этого проста. Изучите свои преобразования 2D-матрицы. А для 2-го пересечения вы даже можете использовать мощные видеокарты, чтобы сделать большую работу!

  • Обнаружение столкновений в узкой фазе Теперь, когда вы определили, что два или более объекта заслуживают сравнения, вы переходите к тонко настроенному разделу. Цель этого этапа - определить результат столкновения. Глубина проникновения, охватываемый объем и т. Д. И эта информация будет введена в любой физический движок, который вы запланировали. В 3D это область алгоритмов расстояния GJK и других чистых алгоритмов, которые мы все так любим!

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

person Community    schedule 19.08.2009

Столкновения между чем? Это зависит от того, используете ли вы спрайты, вогнутые многоугольники, выпуклые многоугольники, прямоугольники, квадраты, круги, точки ...

person Thomas    schedule 19.09.2008