Как лучше всего обнаруживать столкновения в спрайтах двухмерной игры? Сейчас я работаю над allegro и G ++
Лучший способ обнаружить столкновение между спрайтами?
Ответы (7)
Существует множество способов обнаружения столкновения. Методы, которые вы используете, будут немного изменены в зависимости от того, используете ли вы 2D или 3D среду. Также помните, что при установке системы обнаружения столкновений необходимо учитывать любую физику, которую вы можете захотеть реализовать в игре (необходимая для большинства спускаемых 3D-игр), чтобы улучшить ее реальность.
Краткий вариант - использовать ограничивающие рамки. Или, другими словами, сделайте каждую сущность в мире блоком, а затем проверьте, не сталкиваются ли каждая из осей блока с другими объектами.
При большом количестве объектов для проверки на столкновения вы можете проверить октодерево. Вы просто разделите мир на сектора, а затем проверяете столкновение только между объектами в одних и тех же секторах.
Для получения дополнительных ресурсов вы можете перейти на sourceforge и выполнить поиск движка динамики Bullet, который представляет собой движок обнаружения столкновений и физики с открытым исходным кодом, или вы можете проверить http://www.gamedev.net, на котором есть множество ресурсов по обширным темам разработки игр.
Любая достойная библиотека 2D-графики будет либо предоставлять свои собственные функции обнаружения столкновений для всего, от выровненных спрайтов до многоугольников и пикселей, либо иметь одну или несколько хороших сторонних библиотек для выполнения этих функций. Ваш выбор движка / библиотеки / фреймворка должен определять ваши варианты обнаружения столкновений, поскольку они, вероятно, намного более оптимизированы, чем то, что вы могли бы произвести в одиночку.
Для Allegro существует Collegro. Для SDL существует SDL_Collide.h или SDL-Collide. Вы можете использовать I_COLLIDE с OpenGL. DarkBASIC имеет встроенную систему коллизий и DarkPhysics для очень точного взаимодействия, включая коллизии.
Это довольно общий вопрос. Есть много способов обнаружить столкновения в 2D-игре. Было бы полезно узнать, что вы пытаетесь сделать.
Однако для начала существуют довольно простые методы, которые позволяют обнаруживать круги, прямоугольники и т. Д. Я не большой поклонник gamedev.net, но там есть несколько хороших ресурсов об этом типе обнаружения. Одна из таких статей находится здесь. В нем содержится базовый материал, который может помочь вам начать работу.
В простых 2D-играх можно использовать прямоугольники или круги, чтобы «заключить» объект на экране. Определение того, когда перекрываются прямоугольники или круги, является довольно простой математикой. Если вам нужно что-то более сложное (например, выпуклые произвольные многоугольники), то решение будет более сложным. Опять же, здесь может помочь gamedev.net.
Но на самом деле, чтобы ответить на ваш вопрос, нам нужно знать, что вы пытаетесь сделать? Какая игра? С какими типами объектов вы пытаетесь столкнуться? Вы пытаетесь столкнуться с границами экрана и т. Д.
Проверить столкновение двух мячей в 2D очень просто. Вы можете погуглить, но в основном вы проверяете, больше ли длина радиуса двух шаров вместе или равна расстоянию между центрами двух шаров.
Затем вы можете найти точку столкновения, взяв единичный вектор между центрами шаров и умножив его на один из радиусов шаров.
Внедрение системы обнаружения столкновений - сложный вопрос, но вы должны учитывать три момента.
Мир предметов. Разделение пространства. Если вы выполните проверку столкновений каждого двумерного спрайта в вашем мире со всем остальным, у вас будет медленная медленная программа! Вам нужно расставить приоритеты. Вам нужно разделить пространство. Вы можете использовать ортогональную сетку и разрезать свой мир на 2-мерную сетку. Или вы можете использовать дерево BSP, используя строки в качестве функции разделителя.
Обнаружение широких фазовых столкновений. При этом используются ограничивающие объемы, такие как цилиндры или эллипсы (в зависимости от того, что лучше всего соответствует форме ваших спрайтов), чтобы определить, стоит ли сравнивать объекты более подробно. Математика для этого проста. Изучите свои преобразования 2D-матрицы. А для 2-го пересечения вы даже можете использовать мощные видеокарты, чтобы сделать большую работу!
Обнаружение столкновений в узкой фазе Теперь, когда вы определили, что два или более объекта заслуживают сравнения, вы переходите к тонко настроенному разделу. Цель этого этапа - определить результат столкновения. Глубина проникновения, охватываемый объем и т. Д. И эта информация будет введена в любой физический движок, который вы запланировали. В 3D это область алгоритмов расстояния GJK и других чистых алгоритмов, которые мы все так любим!
Вы можете реализовать все это в общем и полиморфно указать широкое и узкое разрешения или предоставить ловушку, если вы работаете на языке более низкого уровня.
Столкновения между чем? Это зависит от того, используете ли вы спрайты, вогнутые многоугольники, выпуклые многоугольники, прямоугольники, квадраты, круги, точки ...