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.
У вас є два основних інструменти для обробки введення команд гравця в Godot:
Вбудовані зворотні виклики введення, в основному
_unhandled_input()
. Як і_process()
, це вбудовані віртуальні функції, які Godot викликає щоразу, коли гравець натискає клавішу. Це інструмент, який ви можете використовувати, щоб реагувати на події, які відбуваються не кожен кадр, а наприклад при натисканні Space для здійснення стрибка. Щоб дізнатися більше про зворотні виклики введення, див. Використання inputEvent.Синглтон
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
var direction = 0;
if (Input.IsActionPressed("ui_left"))
{
direction = -1;
}
if (Input.IsActionPressed("ui_right"))
{
direction = 1;
}
Rotation += _angularSpeed * direction * (float)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
var velocity = Vector2.Zero;
if (Input.IsActionPressed("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
using Godot;
public partial class Sprite : Sprite2D
{
private float _speed = 400;
private float _angularSpeed = Mathf.Pi;
public override void _Process(double delta)
{
var direction = 0;
if (Input.IsActionPressed("ui_left"))
{
direction = -1;
}
if (Input.IsActionPressed("ui_right"))
{
direction = 1;
}
Rotation += _angularSpeed * direction * (float)delta;
var velocity = Vector2.Zero;
if (Input.IsActionPressed("ui_up"))
{
velocity = Vector2.Up.Rotated(Rotation) * _speed;
}
Position += velocity * (float)delta;
}
}
Якщо ви запустите сцену, то тепер зможете обертатися за допомогою клавіш зі стрілками ліворуч і праворуч і рухатися вперед, натискаючи Up.
Підсумок¶
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.