Створення ворога

Тепер настав час зробити ворогів, від яких гравцеві доведеться ухилятися. Їх поведінка буде не дуже складною: вони будуть час від часу виникати по краях екрана і рухатися у випадковому напрямку по прямій лінії.

Ми створимо сцену Mob, яку ми зможемо потім використати, для створення будь-якої кількості незалежних мобів в грі.

Налаштування вузлів

Клацніть Сцена -> Нова сцена вгорі меню та додайте наступні вузли:

Не забудьте встановити для дітей статус, щоб їх не можна було вибрати, як ви це зробили для сцени Player. Для цього виберіть батьківський вузол (RigidBody2D) у доці дерева сцен, а потім натисніть кнопку Group у верхній частині 2D-редактора (або натисніть Ctrl + G).

Виберіть вузол Mob і задайте властивість Gravity Scale в відділі RigidBody2D в Інспекторі на 0. Це не дасть ворогу падати вниз.

Крім того, в розділі CollisionObject2D розміщеним зразу RigidBody2D розверніть групу Collision і виключіть шар 1 в розділі Mask. Завдяки цьому моби не будуть стикатися один з одним.

../../_images/set_collision_mask.webp

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

Властивість Animation Speed (Швидкість анімації) має бути встановлена для кожної анімації окремо. Встановіть значення 3 для всіх трьох.

../../_images/mob_animations.webp

Ви можете використовувати кнопки "Відтворити анімацію" праворуч від поля введення Animation Speed для попереднього перегляду вашої анімації.

Ми вибиратимемо одну з цих анімації випадковим чином, тому моби будуть мати певну різноманітність.

Як і зображення гравця, ці зображення мобів потрібно зменшити. Встановіть в AnimatedSprite2D властивість Scale на (0.75, 0.75).

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

Збережіть сцену.

Скрипт ворога

Додайте такий скрипт до Mob:

extends RigidBody2D

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

func _ready():
    var mob_types = Array($AnimatedSprite2D.sprite_frames.get_animation_names())
    $AnimatedSprite2D.animation = mob_types.pick_random()
    $AnimatedSprite2D.play()

Спочатку ми отримуємо список назв анімацій з властивості 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()

queue_free() — це функція, яка фактично «звільняє» або видаляє вузол у кінці кадру.

На цьому завершуємо сцену Mob.

З гравцем і ворогами закінчено, в наступній частині ми об'єднаємо їх у новій сцені. Ми змусимо ворогів випадковим чином виникати навколо ігрової дошки і рухатися вперед, перетворюючи наш проект в гру.