Сейчас я расскажу о структуре программы Годот Dooge the Creeps

Сегодня продолжим разбирать туториал Godot «Dodge the Creeps». Мы изучим все функции и иерархию сцен этого примера, а также заглянем в справку Godot, чтобы разобраться с непонятными функциями.

Рассмотрим сцену main.tscn. Она включает несколько вложенных сцен: player.tscn и hud.tscn. Также в ней присутствуют таймеры: MobTimer, ScoreTimer и StartTimer. Для воспроизведения музыки и звука смерти персонажа используются два объекта типа AudioStreamPlayer.

Позиция главного персонажа сохраняется с помощью объекта Marker2D, который настроен на центр поля. Важным элементом является путь спавна врагов — Path2D, внутри которого находится узел PathFollow2D. Кроме того, есть ColorRect — он задаёт цвет фона.

Мы описали сцену main.tscn — главную сцену, где разворачивается весь игровой процесс. Однако есть ещё три сцены: player.tscn, mob.tscn и hud.tscn. Рассмотрим их, а затем перейдём к разбору кода.

Рассмотрим сцену player.tscn

Это объект типа Area2D. В него вложены AnimatedSprite2D, CollisionShape2D и GPUParticles2D. Последний отвечает за создание шлейфа, который тянется за игроком.

Рассмотрим сцену mob.tscn

Это объект типа RigidBody2D. В него вложены AnimatedSprite2D, CollisionShape2D и VisibleOnScreenNotifier2D. Последний нужен, чтобы удалять вражеского моба, когда он выходит за границу экрана. Для этого используется метод queue_free(). Узел VisibleOnScreenNotifier2D испускает сигнал screen_exited() — как только враг покидает экран, вызывается функция _on_VisibilityNotifier2D_screen_exited, которая и удаляет текущего врага.

Рассмотрим сцену hud.tscn

Это объект типа CanvasLayer. На нём расположены два элемента Label, одна кнопка Button и один таймер Timer. Таймер срабатывает через секунду и скрывает тот Label, который отвечал за вывод сообщений. При нажатии на Button кнопка скрывается и испускается сигнал start_game, который в свою очередь вызывает функцию new_game в сцене main.

Рассмотрим код main.gd

В проекте используется несколько ключевых функций:

game_over() вызывается сигналом hit(), который испускается игроком (player) при столкновении с врагами.

new_game() запускается сигналом start_game при нажатии на кнопку в сцене hud.

_on_MobTimer_timeout() обрабатывается таймером MobTimer.

_on_ScoreTimer_timeout() связана с таймером ScoreTimer.

_on_StartTimer_timeout() вызывается таймером StartTimer.

Теперь рассмотрим каждую из перечисленных функций по отдельности.

game_over()

Функция останавливает таймер очков (ScoreTimer) и таймер спавна врагов (MobTimer), затем заставляет сцену hud отобразить сообщение об окончании игры, останавливает фоновую музыку и проигрывает звуковой эффект смерти.

new_game()

Функция удаляет всех противников, обнуляет переменную счёта, перемещает игрока в центр экрана, запускает таймер StartTimer, обнуляет отображение счёта в сцене hud.tscn, выводит на экран сообщение «Get Ready» («Приготовьтесь») и запускает фоновую музыку.

_on_MobTimer_timeout()

Функция создаёт нового врага. Для этого она использует объект PathFollow2D, выбирая случайную позицию на пути (свойство progress определяет положение на маршруте). Затем созданному мобу присваивается эта позиция, а его направление поворачивается перпендикулярно траектории движения. После этого добавляется случайный разворот, и полученное значение применяется к вращению моба. Далее генерируется случайная скорость, которая проецируется на направление движения, и готовый бот добавляется на сцену.

_on_ScoreTimer_timeout()

Функция увеличивает значение переменной score на единицу и обновляет отображение счёта в сцене hud.tscn.

_on_StartTimer_timeout()

Функция запускает таймеры MobTimer и ScoreTimer.

Мы разобрали код main.gd. Остальные скрипты устроены значительно проще.

Код hub.gd

Теперь разберём скрипт hud.gd. Он состоит из пяти функций: show_message(), show_game_over(), update_score(), _on_StartButton_pressed() и _on_MessageTimer_timeout(). Давайте рассмотрим каждую из них по порядку.


show_message()

Функция присваивает текстовой метке нужное сообщение, отображает её на экране и запускает таймер MessageTimer(). Через одну секунду таймер отправляет сигнал timeout(), который вызывает функцию _on_MessageTimer_timeout(), которая, в свою очередь, скрывает метку MessageLabel.

show_game_over()

Функция show_game_over() сначала вызывает show_message() с текстом «Game Over», затем ожидает завершения работы таймера MessageTimer (1 секунда). После этого текст метки MessageLabel меняется на «Dodge the Creeps», метка снова отображается, и вновь следует пауза в 1 секунду. В конце на экране появляется кнопка StartButton.

update_score()

Функция обновляет отображение очков в ScoreLabel, преобразуя значение переменной score из целочисленного типа в строковый.

_on_StartButton_pressed()

Функция скрывает кнопку и испускает сигнал start_game, который запускает функцию new_game в скрипте main.gd.

Рассмотрим код player.gd

Скрипт состоит из четырёх функций: _ready(), _process(), start() и _on_body_entered().

_ready()

Функция устанавливает значение переменной screen_size и скрывает игрока.

_process()

Здесь мы управляем игроком и его позицией. С помощью функции is_action_pressed() объекта Input задаём направление движения. Если длина вектора скорости (velocity.length()) больше нуля (то есть игрок движется), то проигрывается соответствующая анимация, а скорость нормализуется. Позиция игрока вычисляется умножением скорости на время delta. Чтобы игрок не выходил за пределы игрового поля, используется функция position.clamp(Vector2.ZERO, screen_size) — при желании её можно написать и самостоятельно. Также имеются функции flip_v и flip_h, которые помогают экономить количество спрайтов для анимации персонажа.

start()

Функция размещает игрока в центре экрана, отображает его и активирует обработку физических взаимодействий.

_on_body_entered()

При столкновении с врагом функция скрывает игрока, отправляет сигнал hit, который вызывает game_over() в скрипте main.gd, и включает обработку физики.

Код mob.gd

Скрипт состоит из двух функций: _ready() и _on_VisibilityNotifier2D_screen_exited().

_ready()

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

_on_VisibilityNotifier2D_screen_exited()

Как только бот покидает границы экрана, он немедленно удаляется.

Конец.

В этой статье я разобрал работу функций кода примера «Dodge the Creeps». В следующей части мы будем экспериментировать и воссоздавать эту игру заново. Спасибо за внимание.

Оставьте комментарий

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

Прокрутить вверх