Обнаружение столкновений обычно сложно для чего-либо, кроме прямоугольников.
Способ, которым я делал это в прошлом, - предоставить изображение и маску для каждого объекта. Так, например, такой объект, как космический корабль Юпитер 2 из Затерянный в космосе , будет иметь следующее изображение и маску:
X 00000100000
XXXXXXX 00111111100
X X 01111111110
X X 11111111111
X X 01111111110
XXXXXXX 00111111100
XXX 00001110000
Изображение - это то, что отображается на экране, а маска - это то, что используется для обнаружения столкновений. Вы заметите, что цифры в маске - это, в основном, контур и содержание изображения.
Способ обнаружения столкновения:
- проверить, перекрываются ли прямоугольники. Если нет, то вероятность столкновения не будет.
- В противном случае создайте прямоугольник объекта № 1, состоящий из его маски.
- Создайте еще один прямоугольник объекта 2, состоящий из его маски.
- Поразрядно-И перекрывающаяся часть прямоугольника 2 с прямоугольником 1.
- Если в прямоугольнике 1 остались какие-либо 1-биты, то возникает коллизия.
При этом учитываются «промахи», когда ограничивающие прямоугольники каждого объекта перекрываются, но не обязательно объект очерчивает себя. Побитовые операторы - эффективный способ обнаружить это.
Вот пример стрелки, не совсем ударяющей по воздушному шару - дрожь перед моими навыками графического дизайна:
....xx....
..xx..xx..
.x......x.
.x......x.
x........x
x........x
.x......x.
.x......x.
..xx..xx..
....xx.**y.....
.y......
yyyyyyyy
.y......
..y.....
Вы можете видеть, что, хотя прямоугольники перекрываются (см. **y
), стрелка фактически не соприкасалась с воздушным шаром. Применяя побитовую операцию И к маскам, эти биты будут иметь нулевое значение, что приведет к невозможности столкновения.
И @kyoryu поднимает интересный момент в своем комментарии. Некоторые игры хорошо адаптируются к объектам, составленным из меньших прямоугольников, и вы можете упростить обнаружение столкновений на основе прямоугольных компонентов (не беспокоясь о совершенстве пикселей). Например, наш старый друг космический захватчик (на самом деле защитник против космических захватчиков в этой игре) может состоять из двух прямоугольников, X и Y, а ракеты сделаны из Z:
YYYY .Z.
YYYY .Z.
XXXXXXXXXXXX .Z.
XXXXXXXXXXXX ZZZ
XXXXXXXXXXXX .Z.
XXXXXXXXXXXX
Это сводится к простой прямоугольной проверке ракеты по двум прямоугольникам космического захватчика. Учитывая размер ракеты, вы, вероятно, можете назвать это столкновением, даже если вы свяжетесь с одним из символов .
ракеты ближнего действия, а не ракеты ударного действия).