Обнаружение столкновений для повернутых растровых изображений на Android
Мне нужно точное столкновение для моей игры для Android. Я написал некоторый код для обнаружения столкновения с "обычными" растровыми изображениями (не повернутыми); работает отлично. Тем не менее, я не получаю его для повернутых растровых изображений. К сожалению, в Java нет класса для повернутых прямоугольников, поэтому я реализовал его сам. Он удерживает положение четырех углов по отношению к экрану и описывает точное местоположение / слой его растрового изображения; называется "itemSurface". Мой план по обнаружению был:
- Обнаружить пересечение различных элементов поверхности
- Расчет площади перекрытия
- Установите эти области по отношению к его превосходящему itemSurface /bitmap
- Сравните каждый отдельный пиксель с соответствующим пикселем другого растрового изображения.
Ну, у меня проблемы с первым и вторым. У кого-нибудь есть идея или есть какой-то код? Возможно, в библиотеках Java/Android уже есть код, и я просто не нашел его.
1 ответ
Я понимаю, что вы хотите обнаружение столкновений между прямоугольниками (повернуты по-разному). Вам не нужно рассчитывать площадь перекрытия. Более того, сравнивать каждый пиксель будет неэффективно.
Реализовать static boolean isCollision
функция, которая скажет вам, есть ли столкновение между одним прямоугольником и другим. Прежде чем взять лист бумаги, сделайте немного геометрии, чтобы узнать точные формулы. Из соображений производительности не оборачивайте прямоугольник в некотором классе Rectangle, просто используйте примитивные типы, такие как double и т. Д.
Тогда (псевдокод):
for (every rectangle a)
for (every rectangle b)
if (a != b && isCollision(a, b))
bounce(a, b)
Это O(n^2), где n - количество прямоугольников. Есть лучшие алгоритмы, если вам нужно больше производительности. bounce
Функция изменяет векторы движущихся прямоугольников так, чтобы имитировать столкновение. Если вес объектов был одинаковым (вы можете приблизить вес к размеру прямоугольников), вам просто нужно поменять местами два вектора скорости.
Чтобы правильно отображать элементы, вам может потребоваться сохранить вспомогательную таблицу boolean alreadyBounced[][]
определить, какие прямоугольники не нуждаются в изменении их векторов после отскока (столкновения), потому что они уже отскочили.
Еще один совет:
Если вы создаете игру под Android, вы должны следить за тем, чтобы не выделять память во время игры, потому что это быстрее вызовет GC, что займет много времени и замедлит вашу игру. Я рекомендую вам посмотреть это видео и связанные с ним. Удачи.