Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Создание врага

Теперь пришло время сделать врагов, от которых нашему игроку предстоит уклоняться. Их поведение будет не очень сложным: толпы (мобы) будут появляться случайно по краям экрана, выбирать случайное направление и двигаться по прямой линии.

Мы создадим сцену Mob, которую затем сможем инстанцировать, чтобы создать любое количество независимых мобов в игре.

Настройка узла

Нажмите "Сцена" -> "Новая сцена" и добавьте следующие узлы:

Не забудьте настроить дочерние узлы, чтобы они не могли быть выбраны, как вы это делали со сценой игрока.

Select the Mob node and set its Gravity Scale property in the RigidBody2D section of the inspector to 0. This will prevent the mob from falling downwards.

Кроме того, в разделе CollisionObject2D, расположенном сразу под разделом RigidBody2D, разверните группу Collision и выключите слой 1 в разделе Mask. Это гарантирует, что мобы не столкнутся друг с другом.

../../_images/set_collision_mask.webp

Настройте AnimatedSprite2D, как вы сделали это для игрока. На этот раз у нас есть 3 анимации: fly (лететь), swim (плыть) и walk (ходить). В папке art есть две картинки для каждой анимации.

Скорость анимации должна быть установлена для каждой анимации отдельно. Установите значение 3 для всех трех анимаций.

../../_images/mob_animations.webp

Вы можете использовать кнопку "Воспроизвести анимацию" справа от поля ввода Скорость анимации для предварительного просмотра ваших анимаций.

Мы выберем одну из этих анимаций случайным образом, так что мобы будут иметь некоторое разнообразие.

Также как изображения игрока, изображения мобов нужно уменьшить. Установите для AnimatedSprite2D в свойстве Scale значение (0.75, 0.75).

Как и в сцене Player, добавьте форму CapsuleShape2D для столкновений. Чтобы выровнять фигуру с изображением, вам нужно установить свойство Rotation на значение 90 (в разделе "Transform" в инспекторе).

Сохраните сцену.

Скрипт врага

Добавьте этот скрипт к Mob:

extends RigidBody2D

Теперь давайте посмотрим на остальную часть скрипта. В функции _ready() мы проигрываем анимацию и случайным образом выбираем один из трех типов анимации:

func _ready():
    var mob_types = $AnimatedSprite2D.sprite_frames.get_animation_names()
    $AnimatedSprite2D.play(mob_types[randi() % mob_types.size()])

Сначала мы получаем список названий анимаций из свойства AnimatedSprite frames. Возвращается Массив, содержащий все три названия анимации: ["walk", "swim", "fly"].

Дальше нам нужно выбрать случайное число между 0 и 2, чтобы выбрать имя одной из анимаций из списка (индексы массива начинаются с 0). Функция randi() % n выбирает случайное целое число между 0 и n-1.

Последняя часть - заставить мобов удаляться, когда они выходят за экран. Подключите сигнал screen exited() узла Visibility Notifier 2D и добавьте этот код:

func _on_visible_on_screen_notifier_2d_screen_exited():
    queue_free()

На этом заканчиваем работу над сценой Mob.

Теперь, когда игрок и враги готовы, в следующей части мы перенесём их на новую сцену. Мы заставим врагов появляться случайно по границам экрана и двигаться вперёд, сделав наш проект играбельным.