Лучший способ обнаружить столкновение между спрайтами? - PullRequest
3 голосов
/ 19 сентября 2008

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

Ответы [ 7 ]

4 голосов
/ 19 сентября 2008

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

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

3 голосов
/ 19 сентября 2008

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

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

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

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

2 голосов
/ 19 сентября 2008

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

1 голос
/ 19 августа 2009

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

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

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

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

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

1 голос
/ 19 сентября 2008

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

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

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

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

0 голосов
/ 27 апреля 2009

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

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

0 голосов
/ 19 сентября 2008

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

...