Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Создание врага
Теперь пришло время сделать врагов, от которых нашему игроку предстоит уклоняться. Их поведение будет не очень сложным: мобы будут появляться случайно по краям экрана, выбирать случайное направление и двигаться по прямой линии.
We'll create a Mob scene, which we can then instantiate to create any number
of independent mobs in the game.
Настройка узла
Нажмите Сцена -> Новая сцена в верхнем меню и добавьте следующие узлы:
RigidBody2D (названный
Mob)
Не забудьте сделать дочерние элементы недоступными для выбора, как это было сделано со сценой Player. Для этого выберите родительский узел (RigidBody2D) в дереве сцены, а затем нажмите кнопку в верхней части 2D-редактора (или нажмите Ctrl + G или Cmd + G на macOS).
Выберите узел Mob и установите значение его свойство Gravity Scale у RigidBody2D на 0. Это предотвратит падение моба вниз.
Кроме того, в инспекторе узла Mob, в разделе CollisionObject2D, разверните группу Collision и снимите отметку 1 в свойстве Mask. Это гарантирует, что мобы не будут сталкиваться друг с другом.
Настройте AnimatedSprite2D, как вы сделали это для игрока. На этот раз у нас есть 3 анимации: fly, swim и walk. В папке art есть две картинки для каждой анимации.
Скорость анимации должна быть установлена для каждой анимации отдельно. Установите значение 3 для всех трех анимаций.
Вы можете использовать кнопку "Воспроизвести анимацию" справа от поля ввода Скорость анимации для предварительного просмотра ваших анимаций.
Мы выберем одну из этих анимаций случайным образом, так что мобы будут иметь некоторое разнообразие.
Также как изображения игрока, изображения мобов нужно уменьшить. Установите для AnimatedSprite2D свойство Scale равным (0.75, 0.75).
Как и в сцене Player, добавьте форму CapsuleShape2D для столкновений. Чтобы выровнять фигуру с изображением, вам нужно установить свойство Rotation на значение 90 (в разделе "Transform" в инспекторе).
Сохраните сцену.
Скрипт врага
Attach a script to the Mob node like this:
extends RigidBody2D
using Godot;
public partial class Mob : RigidBody2D
{
// Don't forget to rebuild the project.
}
Теперь давайте посмотрим на остальную часть скрипта. В функции _ready() мы проигрываем анимацию и случайным образом выбираем один из трех типов анимации:
func _ready():
var mob_types = Array($AnimatedSprite2D.sprite_frames.get_animation_names())
$AnimatedSprite2D.animation = mob_types.pick_random()
$AnimatedSprite2D.play()
public override void _Ready()
{
var animatedSprite2D = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
string[] mobTypes = animatedSprite2D.SpriteFrames.GetAnimationNames();
animatedSprite2D.Play(mobTypes[GD.Randi() % mobTypes.Length]);
}
Сначала мы получаем список названий анимаций из свойства AnimatedSprite2D sprite_frames. Возвращается Массив, содержащий все три названия анимации: ["walk", "swim", "fly"].
В коде GDScript мы используем метод Array.pick_random для случайного выбора одного из этих имен анимации. Между тем, в коде C# мы выбираем случайное число между 0 и 2 для выбора одного из этих имен из списка (индексы массива начинаются с 0). Выражение GD.Randi() % n выбирает случайное целое число между 0 и n-1.
Наконец, мы называем play (), чтобы начать играть в выбранную анимацию.
Последняя часть - заставляет мобов удаляться, когда они выходят за экран. Подключите сигнал screen exited() узла VisibleOnScreenNotifier2D к Mob и добавьте этот код:
func _on_visible_on_screen_notifier_2d_screen_exited():
queue_free()
// We also specified this function name in PascalCase in the editor's connection window.
private void OnVisibleOnScreenNotifier2DScreenExited()
{
QueueFree();
}
queue_free() — это функция, которая по сути «освобождает» или удаляет узел в конце кадра.
This completes the Mob scene.
Теперь, когда игрок и враги готовы, в следующей части мы перенесём их на новую сцену. Мы заставим врагов появляться случайно по границам экрана и двигаться вперёд, сделав наш проект играбельным.