2D обнаружение столкновений в космическом шутере

Теперь нам нужно реализовать простую 2D-систему столкновений между батлетами и врагами. Предполагая, что враги также являются треугольниками, и учитывая, что пуля технически является треугольником, мы можем проверить столкновение между точкой и треугольником, позвольте мне объяснить.

Поскольку пуля представляет собой треугольник и движется в одном направлении, мы можем обойти это, проверив столкновение между верхней вершиной треугольника и вражеским треугольником, уменьшив сложность системы столкновений…

Как вы можете видеть на рисунке выше, у пули красного цвета верхняя вершина выделена зеленым цветом, а враг состоит из 2 желтых треугольников.
Мы можем проверить, находится ли зеленая точка внутри любого из 2 желтых треугольников. или нет, что скажет нам, попала пуля во врага или нет.
Мы можем обойтись без этого трюка вместо проверки треугольника против двух треугольников или против квадрата на столкновение. Пуля представляет собой очень узкий треугольник, и это, вероятно, будет работать очень хорошо и будет быстро.

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

https://gist.github.com/cg-jedi/066f9c2a9dfdc3415c39d1cd4a926a0b

В функции обновления мы зациклимся на всех пулях, созданных ранее, и будем проверять каждую пулю на всех врагов, используя один и тот же метод.
Мы также можем реализовать систему ограничивающих рамок или четырехугольных деревьев… Каждый квадрант — это узел, содержащий враги в качестве дочерних элементов для этого узла, это также повысит производительность, если в игре будет много врагов.

Когда экран разделен на 4 квадранта, легче проверить столкновение пули и врага, исключив более 50% операций.

Исходный код можно найти на Github, см. src/common/physics.h
Вы также можете сыграть в предварительный просмотр игры в браузере Chrome, используя эту ссылку. В следующем уроке мы немного поговорим о текстурировании.

Ваше здоровье!