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

№101. Практика. Управление танком в игре с видом сверху. Часть №2.

Продолжаем развивать нашу сценку. В этой статье будем добавлять стрельбу из танка.
Если вы пропустили первую часть , то она лежит вот тут.
Для этого потребуется снаряд (у нас две пушки , так что будет двойной снаряд !) и эффект взрыва. Для начала займемся взрывом.
Добавляем в проект ноду AnimatedSprite, переименуем её сразу в «fire» и добавим неё наш спрайтщит взрыва. Сразу сделаем несколько правок: 1) Переименуем анимацию в «fire»
2) Добавим в конце пустой кадр.
3) Изменим частоту кадров на 25.
4) Снимем галочку с LOOP, для чтого чтобы наша анимация не игралась постоянно. В итоге сцена должна выглядеть вот так: Выбираем ноду main_scene, подключаем на неё скрипт и пишем следующий код : при нажатии на любую кнопку мышки > проигрываем анимацию взрыва. Выстрел работает. Но можно заметить что он не привязан к пушке.
Этим и заимемся дальше. И тут у нас есть несколько вариантов. Наверное самый простой — это поставить ноду на пушке в том месте где надо показывать взрыв, и в коде привязать поз

Продолжаем развивать нашу сценку. В этой статье будем добавлять стрельбу из танка.
Если вы пропустили первую часть , то она
лежит вот тут.
Для этого потребуется снаряд (у нас две пушки , так что будет двойной снаряд !) и эффект взрыва.

Для начала займемся взрывом.
Добавляем в проект ноду
AnimatedSprite, переименуем её сразу в «fire» и добавим неё наш спрайтщит взрыва.

-2

Сразу сделаем несколько правок:

1) Переименуем анимацию в «fire»
2) Добавим в конце пустой кадр.
3) Изменим частоту кадров на 25.
4) Снимем галочку с LOOP, для чтого чтобы наша анимация не игралась постоянно.

В итоге сцена должна выглядеть вот так:

-3

Выбираем ноду main_scene, подключаем на неё скрипт и пишем следующий код : при нажатии на любую кнопку мышки > проигрываем анимацию взрыва.

-4
-5

Выстрел работает. Но можно заметить что он не привязан к пушке.
Этим и заимемся дальше.

И тут у нас есть несколько вариантов. Наверное самый простой — это поставить ноду на пушке в том месте где надо показывать взрыв, и в коде привязать позиции взрыва к этой ноде…
Но давайте пойдем по немного иному пути.
Обойдемся без лишних нод и напишем всё через код :)
Установим позицию для взрыва равной глобальной позиции башни (ибо локальные равны нулю) + укажем отступ, для того чтобы взрыв появлялся не на самой башне , а на краю пушек.
Так как башня вращается отдельно от танка, то нужно указать это при расчете поворота)

-6

Проверяем:

-7

Неплохо!

Пришло время заняться вылетом снарядов.

Так как в один момент на экране может быть несколько снарядов, то будем делать снаряд инстансом.

Для этого создаем новую 2D сцену на основе KinematicBody2D, и сразу именуем её «bullet».
Дропаем наш спрайт снарядов, и добавлям
collisionShape2D.

-8

Добавляем скрипт на родительскую ноду. Прописываем в него переменную которая будет указывать угол для полета снаряда — tank_angle.
Добавляем функцию которая будет устанавливать этот угол и поворачивать снаряд в сторону полета.
Ну и наш любимый move_and_slide() который будет всё это дело двигать.

-9

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

-10

Если мы сеичас запустим сцену , то увидим что всё работает неплохо, но заметно как пули толкают танк.

-11

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

-12

Осталось дописать всего одну функцию — удаление снаряда при выходе за пределы экрана.
Заходим в скрипт снаряда, добавляем ноду
VisibilityNotifier2D, и снимаем с неё сигнал screen_exited().

-13

И наконец наш финальный результат :

-14

Надеюсь вам был полезен этот материал.
Подписывайтесь на канал, и
вступайте в группу в ВК и не забывайте про дискорд сервер.