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.

Обробка вводу гравця

Опираючись на попередній урок Створення першого сценарію, давайте розглянемо ще одну важливу особливість будь-якої гри: надання контролю гравцеві. Щоб зробити це, нам потрібно змінити наш код sprite_2d.gd.

../../_images/scripting_first_script_moving_with_input.gif

У вас є два основних інструменти для обробки введення команд гравця в Godot:

  1. Вбудовані зворотні виклики введення, в основному _unhandled_input(). Як і _process(), це вбудовані віртуальні функції, які Godot викликає щоразу, коли гравець натискає клавішу. Це інструмент, який ви можете використовувати, щоб реагувати на події, які відбуваються не кожен кадр, а наприклад при натисканні Space для здійснення стрибка. Щоб дізнатися більше про зворотні виклики введення, див. Використання inputEvent.

  2. Синглтон Input. Синглтон є глобально доступний об’єкт. Godot надає доступ до кількох синглтонів у скриптах. Це правильний інструмент для перевірки введення кожного кадру.

Тут ми будемо використовувати синглтон Input, оскільки нам потрібно знати, чи хоче гравець повернути чи перемістити кожен кадр.

Для повороту ми повинні використовувати нову змінну: direction. Оновіть функцію _process(), замініть рядок rotation += angular_speed * delta на наведений нижче код.

var direction = 0
if Input.is_action_pressed("ui_left"):
    direction = -1
if Input.is_action_pressed("ui_right"):
    direction = 1

rotation += angular_speed * direction * delta

Наша локальна змінна direction є множником, що представляє напрямок, у якому гравець хоче повернутись. Значення 0 означає, що гравець не натискав клавіші зі стрілкою вліво або вправо. Значення 1 означає, що гравець хоче повернути праворуч, а -1 означає, що він хоче повернути ліворуч.

Щоб отримати ці значення, ми вводимо умовні оператори та використання Input. Умовний оператор починається з ключового слова if в GDScript і закінчується двокрапкою. Умова – це, власне, вираз між ключовим словом і двокрапкою в кінці рядка.

Щоб перевірити, чи була натиснута клавіша в цьому кадрі, ми викликаємо Input.is_action_pressed(). Метод приймає текстовий рядок, що представляє елемент введення, і повертає true, якщо елемент натиснуто, або false в іншому випадку.

Дві дії, які ми використовуємо вище, "ui_left" і "ui_right", попередньо визначені в кожному проекті Godot. Вони відповідно спрацьовують, коли гравець натискає стрілки ліворуч і праворуч на клавіатурі або ліворуч і праворуч на D-паді геймпада.

Примітка

Ви можете переглянути та редагувати дії введення у вашому проєкті, перейшовши до Project > Project Settings та натиснувши на вкладку Input Map.

Нарешті ми використовуємо direction, як множник коли ми оновлюємо на rotation вузла: rotation += angular_speed * direction * delta.

Закоментуйте рядки var velocity = Vector2.UP.rotated(rotation) * speed та position += velocity * delta таким чином:

#var velocity = Vector2.UP.rotated(rotation) * speed

#position += velocity * delta

При цьому буде проігноровано код, який перемістив позицію піктограми по колу без введення користувачем у попередній вправі.

Якщо ви запустите сцену з цим кодом, іконка зможе повертатися коли ви тиснете Left та Right.

Рух при натисканні "up"

Щоб рухатися лише під час натискання клавіші, нам потрібно змінити код, який обчислює швидкість. Розкоментуйте код і замініть рядок, що починається з var velocity, кодом нижче.

var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
    velocity = Vector2.UP.rotated(rotation) * speed

Ми ініціалізуємо velocity значенням Vector2.ZERO, іншою константою вбудованого типу Vector, що представляє двовимірний вектор довжини 0.

Якщо гравець натискає дію "ui_up", ми оновлюємо значення швидкості, змушуючи спрайт рухатися вперед.

Завершений скрипт

Ось повний файл sprite_2d.gd для порівняння.

extends Sprite2D

var speed = 400
var angular_speed = PI


func _process(delta):
    var direction = 0
    if Input.is_action_pressed("ui_left"):
        direction = -1
    if Input.is_action_pressed("ui_right"):
        direction = 1

    rotation += angular_speed * direction * delta

    var velocity = Vector2.ZERO
    if Input.is_action_pressed("ui_up"):
        velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta

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

../../_images/scripting_first_script_moving_with_input.gif

Підсумок

В загальному, кожен скрипт у Godot представляє клас і розширює один із вбудованих класів рушія. Типи вузлів, від яких успадковують ваші класи, надають вам доступ до таких властивостей, як rotation та position у випадку нашого спрайта. Ви також успадковуєте багато функцій, які ми не використовували в цьому прикладі.

У GDScript змінні, які ви розміщуєте у верхній частині файлу, є властивостями вашого класу, які також називаються змінними-членами. Крім змінних, ви можете визначити функції, які, здебільшого, будуть методами ваших класів.

Godot надає кілька віртуальних функцій, які ви можете визначити, щоб підключити ваш клас до рушія. Вони включають _process(), щоб застосовувати зміни до вузла в кожному кадрі, і _unhandled_input(), щоб отримувати події введення, як-от натискання клавіш і кнопок від користувачів. Є ще чимало інших.

Синглтон Input дозволяє вам реагувати на ввід гравця будь-де у вашому коді. Зокрема, ви зможете використовувати його в циклі _process().

У наступному уроці, Використання сигналів,ми розглянемо зв’язок між скриптами та вузлами, змушуючи наші вузли запускати код у скриптах.