Розробка ігор із Godot 🤖

Skip to content

Це машинний переклад, який може містити помилки!

Звідки взялася ця інформація?

Багато з цього – це просто переказ офіційної документації Godot. Нижче наведено кілька корисних посилань на офіційну документацію (я якомога більше рекомендую її замість цієї на Piggy, але якщо ви віддаєте перевагу цій, то просто використовуйте її!)

Корисні ресурси:

А як щодо графіки, чи потрібно мені створювати її самостійно?

Ні! Ви можете знайти багато безкоштовних ресурсів тут:

Інші корисні посилання:

Інші ігрові рушії?

Якщо ви віддаєте перевагу, можете використовувати інші ігрові рушії. Приклади інших ігрових рушіїв включають:

Існує багато інших також; не соромтеся шукати, якщо хочете спробувати щось інше!

Що таке Godot?

Godot (Вимовляється Гух-до), це ‘Game Engine’ (Ігровий рушій). Щоб сказати просто, це програма, яка дозволяє вам створювати ігри (або звичайні програми, якщо хочете). Godot може робити майже все, що можуть робити інші ігрові рушії, як 2D, так і 3D.

Приклади ігор, створених у Godot: Godot Showcase

Не лише Indie-ігри були створені у Godot, Sonic Colors Ultimate створено за допомогою Godot!

Як отримати доступ до Godot?

Ви можете завантажити Godot із таких джерел:

Просто завантажте та встановіть його (або запустіть безпосередньо через Steam).

Створіть проєкт!

Коли ви запускаєте Godot, з’явиться це вікно:

Проєкт Godot

Тут вам запропонують обрати мову програмування: GDScript або C#. GDScript дуже схожий на Python.

Різниця між GDScript та Python (без кольорів):

def hello():
    text = "Привіт, світ!"

    print(text)
func hello():
    var text = "Привіт, світ!"

    print(text)

Для оголошення змінних у Python достатньо просто вказати її ім’я. У GDScript потрібно спочатку писати var. Для створення функцій використовується ключове слово func замість def.

Сцени та вузли

Одним із найважливіших понять у Godot є сцени (Scenes) та вузли (Nodes). Почнемо з вузлів. Вузол — це об’єкт у Godot, який може представляти будь-що. Це можуть бути сутності гравця або ворога, кнопка в меню, текст на екрані тощо. Сцена являє собою сукупність вузлів.

Тут ми створимо дуже простий приклад.

Частина 1a - Налаштуйте сцену «player»

У верхній частині вікна Godot натисніть кнопку «2D», щоб перемкнути перегляд на режим 2D.

Зліва у вікні ви бачите наступний інтерфейс користувача:

Створити сцену

Натисніть кнопку «Other Node», знайдіть «CharacterBody2D», оберіть її та натисніть «Create». Це вузол (node), який використовується для гравця в 2D-просторі. Можливо, поруч із вузлом «CharacterBody2D» відображається попереджувальний трикутник ⚠️. Це пов’язано з тим, що йому бракує деяких елементів, які були би корисними.

Якщо клацнути правою кнопкою миші по вузлому, там є кнопка «+ Add Child Node…». Виконайте цю дію і додайте два підвузли: Sprite2D та CollisionShape2D. Sprite2D використовується для відображення графіки персонажа, а інший — для перевірки колізій. Ви також можете дати їм власні назви, якщо це спростить орієнтацію. Я надав своєму CharacterBody2D ім’я “Player”. Сцена зараз має виглядати так:

Поточна сцена

Частина 1б – Виправлення попередження на CollisionShape2D

Попереджувальний трикутник у цьому випадку вказує на те, що об’єкт CollisionShape2D фактично не має колізії. Ви можете виправити це, натиснувши вузол (зліва); праворуч з’явиться панель із великою кількістю інформації про цей вузел, яку можна редагувати. Рекомендую поекспериментувати зі значеннями там. Однак нас цікавить параметр «Shape» — установіть для нього, наприклад, тип RectangleShape2D. Це не надто важливо, оскільки ми не будемо використовувати ці колізії тут.

Частина 1c - Додати Sprite, графіка

Якщо ви натискаєте на Sprite2D зліва, з’являється поле справа, де написано “Texture”. Тут ви можете вставити зображення для гравця. Просто перетягніть зображення та відпустіть його в поле.

Ось як це виглядатиме після додавання спрайту.

Меню спрайту

Частина 2 — Додавання вводу та перевірка

У верхній частині вікна знаходиться меню «Сцена – Проект – Зневадження (Debug) – Редактор – Допомога». Натисніть на пункт «Проект», а потім натисніть «Налаштування проекту» («Project Settings»). Тут відкриється список із багатьма налаштуваннями. Виберіть вкладку «Карта введення» («Input Map»), де можна призначити клавіші на клавіатурі.

  • У полі «Додати нову дію» («Add New Action») напишіть left, після чого натисніть кнопку «Додати» («Add»).
  • Потім додайте right, up і down.
  • Ці елементи називаються «діями» («Actions»).
  • На кожну «дію» ви можете додати кнопки, натискаючи плюсик зі сторони праворуч.

Кнопка плюса

  • Просто натисніть потрібну клавішу на клавіатурі, а потім натисніть Додати.
  • Додайте кнопки для всіх дій.

Розділ 3 - Додавання скрипта для керування гравцем.

Щоб мати змогу додавати ігрову логіку, тобто робити щось із гравцем, фоном або чим завгодно іншим у грі, нам потрібен скрипт. Скрипти – це код, і їх можна писати двома мовами: GDScript або C#. GDScript є стандартним.

  • Натисніть на вузол “CharacterBody2D” (я назвав його “Player”).
  • Натисніть кнопку “Attach Script” (дивіться нижче)

Attach script button

  • Тут з’явиться вікно, де ви можете вибрати мову (виберіть GDScript) та шлях (просто залиште його з назвою, яка там є, але ви можете дати йому назву), а потім натисніть далі. Тут з’явиться вікно “Script”. Спочатку тут небагато.

extends CharacterBody2D

Єдине, що робить цей код наразі, це те, що код повинен належати до вузла типу “CharacterBody2D”, який є нашим гравцем.

Ми додамо сюди функцію, яку ми будемо використовувати для маніпулювання гравцем:

extends CharacterBody2D

func _physics_process(delta: float) -> void:
    return

Physics Process?

_physics_process — це функція, яка оновлюється кожного «кадру», тобто приблизно 60 разів на секунду (за замовчуванням). Існує інша функція, яка називається просто _process, і вона оновлюється постійно. Якщо ви хочете, щоб гравець рухався з рівномірною швидкістю, використовуйте _physics_process.

Тут ми будемо додавати код, який переміщує гравця.

Розділ 4 - Базовий ввід

У розділі 2 ви додали кнопки введення, тепер ми будемо їх використовувати. Існує вбудований об’єкт під назвою Input, який ми можемо використовувати для перевірки, чи натиснув гравець на те, що ми налаштували в “Input Map”.

Спробуйте додати цей код у _physics_process код:

if Input.is_action_pressed('right'):
   # Рух вправо
   velocity.x = 100

# Переміщення та зіткнення
move_and_slide()

Що таке move_and_slide()?

move_and_slide() — це вбудована функція в Godot, яка використовується, коли ми хочемо фактично перемістити те, до чого вона застосовується. Без неї гравець не рухатиметься.

Warning

Відступи на рядках дуже важливі, це схоже на те, як у Python.

Що відбувається, коли ви запускаєте програму, натискаючи кнопку відтворення у вікні Godot, а потім «праворуч»?

Якщо нічого не стається зараз:

  • Чи пам’ятаєте ви налаштувати щось у «Карти вводу» (Input Map)?
  • Ви написали right, а не Right? Тобто те, що ви написали в коді, збігається із назвою на карті введення?

Весь код на даний момент
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100

    move_and_slide()

Спробуйте зараз додати код для 'left', 'up', 'down'.

Що має бути velocity.x для left? А як щодо up та down?

Весь код зараз
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

Частина 5 - Виправлення коду

Ви, можливо, помітили, що гравець не зупиняється, коли ви відпускаєте напрямок. Ми можемо виправити це зараз!

Перед усіма if-ами, додайте рядок, який встановлює швидкість до 0. Ви можете зробити це, написавши velocity = Vector2()

Усі швидкості та напрямки в Godot є векторами, це математичне поняття, яке ми зараз не будемо розбирати, але якщо вас цікавить, що це означає, ви можете перейти сюди: Wikipedia vectors.

Весь код зараз
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    velocity = Vector2()

    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

Коли ви запускаєте гру зараз, ви можете переміщувати гравця:

Далі можна виправити код так, щоб швидкість не була просто числом, а зберігалася в іншому місці.

Наприклад, перед функцією можна додати константу, яка буде відстежувати швидкість.

Весь код остаточно з використанням const

```gdscript
extends CharacterBody2D

const ШВИДКІСТЬ = 100

func _process_fizyky(delta: float):
швидкість = вектор_двохвимірний(ШУКАТИ, ПОЗИЦІЯ ІНФОРМАЦІЇ ПРО КОМАНДУ (ПРАВО)) {
shvidkost_x = ШИВКОСТЬ.шукати(“праворуч”) == true ? SHIVKOST : (-SHIVKOСТ) ;}if(input_is_actioN_prESSED (“вниз”)){shVIdkOSt_y=ShIvkoST; } IF(InPut_Is_Action_PrEssEd (‘UP’)){ ShVI DKo ST_Y=-sHivKo st;} Move_And_SlIde();```

Розділ 6 - Грайте самі!

Якщо ви повернетеся до першої частини, Корисні Ресурси, ви зможете знайти, з чим можете продовжувати грати.

Після цього ви можете спробувати створити свою власну гру. Що ви створите – залежить від вас! Якщо ви хочете створити щось абсолютно нове, робіть це! Якщо ви хочете спробувати наслідувати гру, яка вже існує, робіть це! Найкращий спосіб навчитися – це пробувати!