Cocos2d: рассчитать отскок пули при столкновении с блоком - PullRequest
2 голосов
/ 28 августа 2011

У меня есть пуля, которая может отскочить от блока. Я хочу выяснить, отскакивает ли пуля в направлении x или y. Как вы можете видеть на изображении, разница только в несколько пикселей позволяет пули отражать его в другом направлении. (К вашему сведению: пули могут отскочить в моей игре; -))

http://i.stack.imgur.com/5EmGz.png

Кто-нибудь знает простое и надежное решение этой проблемы?

Большое спасибо за вашу помощь

Felix

1 Ответ

5 голосов
/ 31 августа 2011

Чтобы добиться отскока, нужно сделать две вещи:

  1. Обнаружение столкновения
  2. обновить позицию и скорость пули

Шаг 1:

Если вы хотите правильно определять столкновения, вы должны рассчитать пересечение границы прямоугольника с линией, которая соединяет текущую позицию маркера с вычисленной следующей позицией маркера (как если бы не было препятствия). Если есть несколько точек пересечения, возьмите первую точку, которая достигает границы. В Box2D вы бы использовали raycast , чтобы получить пересечение.

Этот ответ поможет вам определить, существуют ли пересечения: Определить, пересекает ли отрезок прямой квадрат

Теперь вам нужно знать, с какой стороны прямоугольника произошло столкновение. Следующий подход предполагает, что вы уже знаете, что произошло столкновение, но не знаете, где:

Collision detection

Когда позиция пули находится в области B, D, E или G. Очевидно, какая граница будет поражена.

В любом другом случае это не так ясно. Позвольте мне объяснить это для региона H:

  1. вычислить вектор h (от позиции маркера до правого нижнего угла прямоугольника)
  2. вычислить угол a из вектора скорости v (используя тангенс)
  3. вычислить угол b из h (используя тангенс)
  4. сравните a и b: если столкновение a b снизу

Действуйте аналогично в случае региона A, C или F.

Шаг 2:

Если у вас есть точка пересечения, установите новую позицию пули в точку пересечения (если вы не смогли получить точку пересечения, обновите позицию, как если бы не было препятствия, но это было бы немного неточным ). Если столкновение произошло снизу или сверху, инвертируйте y-компоненту скорости. Если столкновение произошло справа или слева, инвертируйте x-компоненту скорости.

Удачи!

...