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

Building upon the previous lesson Створення першого сценарію, let's look at another important feature of any game: giving control to the player. To add this, we need to modify our Sprite.gd code.

../../_images/scripting_first_script_moving_with_input.gif

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

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

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

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

For turning, we should use a new variable: direction. In our _process() function, replace the rotation += angular_speed * delta line with the code below.

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-паді геймпада.

Примітка

Ви можете переглядати та редагувати дії введення у своєму проекті, перейшовши в Проект -> Параметри проекту та натиснувши вкладку Карта введення.

Нарешті ми використовуємо direction, як множник коли ми оновлюємо на rotation вузла: rotation += angular_speed * direction * 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", ми оновлюємо значення швидкості, змушуючи спрайт рухатися вперед.

Complete script

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

extends Sprite

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().

In the next lesson Using signals, we'll build upon the relationship between scripts and nodes by having our nodes trigger code in scripts.