Створення ворога
Тепер настав час зробити ворогів, від яких гравцеві доведеться ухилятися. Їх поведінка буде не дуже складною: вони будуть час від часу виникати по краях екрана і рухатися у випадковому напрямку по прямій лінії.
Ми створимо сцену Mob, яку ми зможемо потім використати, для створення будь-якої кількості незалежних мобів в грі.
Налаштування вузлів
Клацніть Сцена -> Нова сцена вгорі меню та додайте наступні вузли:
RigidBody2D (тверде тіло 2D) (названий
Mob)VisibleOnScreenNotifier2D (Видимість на екрані)
Не забудьте налаштувати нащадків, щоб вони не могли бути обрані, як ви робили це зі сценою гравця.
Виберіть вузол Mob і задайте властивість Gravity Scale в відділі RigidBody2D в Інспекторі на 0. Це не дасть ворогу падати вниз.
Крім того, в розділі CollisionObject2D розміщеним зразу RigidBody2D розверніть групу Collision і виключіть шар 1 в розділі Mask. Завдяки цьому моби не будуть стикатися один з одним.
Налаштуйте AnimatedSprite2D так, як ви налаштовували його для гравця. На цей раз, у нас є 3 анімації: fly (літати), swim (плавати), і walk (ходити). В папці art є по два зображення для кожної анімації.
Властивість Animation Speed (Швидкість анімації) має бути встановлена для кожної анімації окремо. Встановіть значення 3 для всіх трьох.
Ви можете використовувати кнопки "Відтворити анімацію" праворуч від поля введення Animation Speed для попереднього перегляду вашої анімації.
Ми вибиратимемо одну з цих анімації випадковим чином, тому моби будуть мати певну різноманітність.
Як і зображення гравця, ці зображення мобів потрібно зменшити. Встановіть в AnimatedSprite2D властивість Scale на (0.75, 0.75).
Як і в сцені Player, додайте CapsuleShape2D для зіткнення. Щоб вирівняти фігуру із зображенням, потрібно встановити властивість Rotation (поворот) на 90 (під "Transform" в Інспекторі).
Збережіть сцену.
Скрипт ворога
Додайте такий скрипт до Mob:
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.
Finally, we call play() to start playing the chosen animation.
Останній фрагмент - це змусити мобів видаляти себе, коли вони залишають екран. Підключіть сигнал 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() — це функція, яка фактично «звільняє» або видаляє вузол у кінці кадру.
На цьому завершуємо сцену Mob.
З гравцем і ворогами закінчено, в наступній частині ми об'єднаємо їх у новій сцені. Ми змусимо ворогів випадковим чином виникати навколо ігрової дошки і рухатися вперед, перетворюючи наш проект в гру.