Продолжаем развивать нашу сценку. В этой статье будем добавлять стрельбу из танка.
Если вы пропустили первую часть , то она лежит вот тут.
Для этого потребуется снаряд (у нас две пушки , так что будет двойной снаряд !) и эффект взрыва.
Для начала займемся взрывом.
Добавляем в проект ноду AnimatedSprite, переименуем её сразу в «fire» и добавим неё наш спрайтщит взрыва.
Сразу сделаем несколько правок:
1) Переименуем анимацию в «fire»
2) Добавим в конце пустой кадр.
3) Изменим частоту кадров на 25.
4) Снимем галочку с LOOP, для чтого чтобы наша анимация не игралась постоянно.
В итоге сцена должна выглядеть вот так:
Выбираем ноду main_scene, подключаем на неё скрипт и пишем следующий код : при нажатии на любую кнопку мышки > проигрываем анимацию взрыва.
Выстрел работает. Но можно заметить что он не привязан к пушке.
Этим и заимемся дальше.
И тут у нас есть несколько вариантов. Наверное самый простой — это поставить ноду на пушке в том месте где надо показывать взрыв, и в коде привязать позиции взрыва к этой ноде…
Но давайте пойдем по немного иному пути.
Обойдемся без лишних нод и напишем всё через код :)
Установим позицию для взрыва равной глобальной позиции башни (ибо локальные равны нулю) + укажем отступ, для того чтобы взрыв появлялся не на самой башне , а на краю пушек.
Так как башня вращается отдельно от танка, то нужно указать это при расчете поворота)
Проверяем:
Неплохо!
Пришло время заняться вылетом снарядов.
Так как в один момент на экране может быть несколько снарядов, то будем делать снаряд инстансом.
Для этого создаем новую 2D сцену на основе KinematicBody2D, и сразу именуем её «bullet».
Дропаем наш спрайт снарядов, и добавлям collisionShape2D.
Добавляем скрипт на родительскую ноду. Прописываем в него переменную которая будет указывать угол для полета снаряда — tank_angle.
Добавляем функцию которая будет устанавливать этот угол и поворачивать снаряд в сторону полета.
Ну и наш любимый move_and_slide() который будет всё это дело двигать.
Вернемся в общую сцену, и добавим туда немного кода.
Он будет добавлять в сцену по клику инстанс сцены снаряда , и передавать в скрипт снаряда угол через метод который мы добавили в скрипт снаряда.
Если мы сеичас запустим сцену , то увидим что всё работает неплохо, но заметно как пули толкают танк.
Это происходит из-за того что зоны соударений пересекаются, и объекты отталкиваются друг от друга.
Просто вынесем пулю в соседний слой, и проблем больше не будет.
Осталось дописать всего одну функцию — удаление снаряда при выходе за пределы экрана.
Заходим в скрипт снаряда, добавляем ноду VisibilityNotifier2D, и снимаем с неё сигнал screen_exited().
И наконец наш финальный результат :
Надеюсь вам был полезен этот материал.
Подписывайтесь на канал, и вступайте в группу в ВК и не забывайте про дискорд сервер.