Обнаружение столкновений для повернутых растровых изображений на Android

Мне нужно точное столкновение для моей игры для Android. Я написал некоторый код для обнаружения столкновения с "обычными" растровыми изображениями (не повернутыми); работает отлично. Тем не менее, я не получаю его для повернутых растровых изображений. К сожалению, в Java нет класса для повернутых прямоугольников, поэтому я реализовал его сам. Он удерживает положение четырех углов по отношению к экрану и описывает точное местоположение / слой его растрового изображения; называется "itemSurface". Мой план по обнаружению был:

  1. Обнаружить пересечение различных элементов поверхности
  2. Расчет площади перекрытия
  3. Установите эти области по отношению к его превосходящему itemSurface /bitmap
  4. Сравните каждый отдельный пиксель с соответствующим пикселем другого растрового изображения.

Ну, у меня проблемы с первым и вторым. У кого-нибудь есть идея или есть какой-то код? Возможно, в библиотеках 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, что займет много времени и замедлит вашу игру. Я рекомендую вам посмотреть это видео и связанные с ним. Удачи.

Другие вопросы по тегам