Рикошет и пробиваемость стен для top-down-shooter игры

Сообщение Рикошет и пробиваемость стен для top-down-shooter игры
» 13 фев 2020, 00:00

Доброго всем дня. В этом уроке я покажу, как сделать фичу рикошетов и пробития стен для top-down-shooter игры.

Первым делом создаём наше оружие, у меня это просто "ствол". Затем задем ему переменную penetration, при помощи которой будет проверяться пробила пуля стену или нет.

1.png


Дальше нужно выставить ось вращения нашего ствола ...

2.png


... и сделать ему "дуло", т. е. точку спавна снарядов.
3.png


Дальше создаём непосредственно саму пулю и стену. Стене можно дать переменную, отражающую ее толщину, но я привежу это значение к толщине спрайта, точнее к значению wall.Height.
4.png


Далее нужно заняться управлением ствола. Добавляем объект Mouse, создаём события, где при помощи колёсика мыши ствол будет ездить вверх и вниз, а при помощи ЛКМ стрелять. Также нужно, чтобы ствол всегда смотрел в сторону курсора.

5.png


Подготовка закончена.

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


6-1.png


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

111.png


Теперь немного теории. Нам нужно как-то рассчитать угол и толщину стены, которую преодолеет пуля.

Ну угол рассчитать несложно: |(угол стены)-(угол пули)|; модуль нужен, чтобы избежать "отрицательных градусов" и чтобы все углы были от 0 до 360.

Теперь нужно ещё больше уменьшить диапазон угла. Т. к. мы ищем угол между двумя прямыми, то он должен быть от 0 до 90 градусов, следовательно мы получаем четыре интервала и три формулы для вычисления. (интервалы см. на рис. ниже; х - это угол)
6.png


Далее нужно понять, как найти толщину, которую пройдет пуля. Ну тут совсем несложно, формула на рисунке ниже:
8e.png


Возвращаемся в С2.

Задаем наши четыре промежутка
(тут я немного неправильно сделал, из-за этого в дальнейшем "код" будет трудночитаем, поэтому, чтобы избежать этого я также ввел переменную Ang1e, в которую я записывал "реальный угол" от 0 до 90 градусов)

7e.png


-дальше просто проверяем в какой четверти находится наш угол
-переводим его к промежутку от 0 до 90 градусов и одновременно проверяем больше он 30 градусов или нет
-если угол больше 30 градусов, то считаем толщину, которую должна преодолеть пуля
--если толщина больше penetration, то уничтожаем пулю
(следовательно, если penetration больше толщины то с пулей ничего не происходит)
-в противном случае, если угол меньше 30 градусов, то совершаем рикошет.
10.png

9.png

12.png


Вот и все. Спасибо за внимание. Если появились вопросы или нашли ошибку, то пишите прямо здесь.

PS

Нашел у себя опечатку на рисунке с окружностью, но менять я его конечно не буду. :smile: (просто она ни на что не влияет)

Также во время редактирования заметил, что "|x-180|" и "х-180" можно объединить в "|x-180|", т. к. они оба всегда положительные.

Также есть сам исходник
rikoshet.capx
(174.77 КБ) Скачиваний: 19
11.png
Аватара пользователя

Черепашка
Сообщений: 25
Я тут с 02 июн 2019, 01:30
Откуда: Из России