Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

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

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_2d.gd code.

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

Примітка

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

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

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

Here is the complete sprite_2d.gd file for reference.

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

Підсумок

In summary, every script in Godot represents a class and extends one of the engine's built-in classes. The node types your classes inherit from give you access to properties, such as rotation and position in our sprite's case. You also inherit many functions, which we didn't get to use in this example.

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

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

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

In the next lesson, Використання сигналів, we'll build upon the relationship between scripts and nodes by having our nodes trigger code in scripts.