Найти в Дзене
Игровой движок Godot engine

№103.Практика. Управление танком в игре с видом сверху. Часть №4. Вражеские пушки.

Итак, в прошлом уроке мы дособрали полностью наш танк. Он ездит и стреляет.
Пришло время добавить вражеские элементы в виде пушек.

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

Спрайты я взял следующие :

Собственно основание, пушка и снаряд.
Собраем это всё в отдельную сцену под обычной Node2D нодой.

-2

Называем корневую ноду «enemy», и собираем сцену как показано на картинке выше.
base , base_shadow —основание + тень основания башни
can_shad —тень пушки
cannon —пушка
fire —анимированный спрайт взрыва, скопирован из сцены с танком.
RayCast2D —луч для отслеживания пересечений с танком.
lazer —спрайт лазерного луча с текстурой градиента.
Area, CollisionShape2D — StaticBody2D для того чтобы снарядам от танка было с чем сталкиваться.

Ничего особенно тут расписывать смысла нет. Укажу лишь, что я не стал использовать для лазера именно растровую текстуру, а взял «генератор» (New GradientTexture)

-3

Ну а далее как обычно приступаем к коду. Опять же, не вижу смысла расписывать в этой части все подробности. Приложу весь код в виде картинки , и укажу на основные моменты в описании ниже.

-4

Для начала определимся с дистанцией, которая требуется для того чтобы пушка «увидела» врага. У нас она будет равна 300.
Если дистанция между танком и пушкой меньше чем 300, она поворачивается в сторону танка при помощи lerp функции. Если при этом рейкаст луч касается танка , то это значит, что можно стрелять !
Для того чтобы пушка не стреляла по танку постоянно при пересечении луча, заведем переменную fire. При пересечении будем постоянно из неё вычитать, и при значении <0 будем вызывать функцию выстрела и выставлять переменную в 60, после чего при условии касания луча с танком она снова будет уменьшаться пока не станет меньше нуля.
Ну а пока никого в зоне видимости пушки нет — пушка поворачивается в рандомные углы, имитируя поиск целей.
Это все делается через рандом и переменную t_rand_ang.

Функция выстрела пушки создает снаряд, и вносит в его функцию ta_set(x,y) данные по углу и позиции. После чего скрипт подключенный на снаряд двигает снаряд по этим данным.

Сохраняем, если вы еще этого не сделали эту сцену. Имя сцены, если ничего не менять будет «enemy».

Переключимся на снаряд пушки.
Сам снаряд и его скрипт являются копией снаряда от танка, с незначительными изменениями: Для отрисовки взрыва снаряда при столкновении с танком вызывается функция из корневой ноды общей сцены
explodion(), куда просто подается позиция в которую попал снаряд.

так выглядит сцена и скрипт снаряда пушки
так выглядит сцена и скрипт снаряда пушки

Сама функция explodion() в скрипте main_scene выглядит так :

-6

Внутри explosion.tscn подвешен скрипт , который удаляет ноду при завершении анимации.

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

Ну а теперь протестируем нашу сцену. Накинем сразу восемь пушек в главную сцену , и увидим следующую картину !

-7

На этом пока всё. Как вы могли заметить , никто никого пока не уничтожает.
Со всем этим , скорее всего, разберемся в следующей части !

Если у вас остались какие то вопросы, вы всегда можете написать в чат ВК группы, в обсуждения ВК группы или на дискорд сервер. Все ссылки есть в описании канала.

Удачи !