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

StackOverflow https://stackoverflow.com/questions/98642

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top