Створення ворога
Тепер настав час зробити ворогів, від яких гравцеві доведеться ухилятися. Їх поведінка буде не дуже складною: вони будуть час від часу виникати по краях екрана і рухатися у випадковому напрямку по прямій лінії.
Ми створимо сцену Mob, яку ми зможемо потім використати, для створення будь-якої кількості незалежних мобів в грі.
Налаштування вузлів
Клацніть Сцена -> Нова сцена вгорі меню та додайте наступні вузли:
RigidBody2D (тверде тіло 2D) (названий
Mob)VisibleOnScreenNotifier2D (Видимість на екрані)
Не забудьте встановити для дітей статус, щоб їх не можна було вибрати, як ви це зробили для сцени Player. Для цього виберіть батьківський вузол (RigidBody2D) у доці дерева сцен, а потім натисніть кнопку у верхній частині 2D-редактора (або натисніть Ctrl + G).
Виберіть вузол 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.
Нарешті, ми викликаємо 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() — це функція, яка фактично «звільняє» або видаляє вузол у кінці кадру.
На цьому завершуємо сцену Mob.
З гравцем і ворогами закінчено, в наступній частині ми об'єднаємо їх у новій сцені. Ми змусимо ворогів випадковим чином виникати навколо ігрової дошки і рухатися вперед, перетворюючи наш проект в гру.