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.
Checking the stable version of the documentation...
Обробка вводу гравця
Опираючись на попередній урок Створення першого сценарію, давайте розглянемо ще одну важливу особливість будь-якої гри: надання контролю гравцеві. Щоб зробити це, нам потрібно змінити наш код sprite_2d.gd.
У вас є два основних інструменти для обробки введення команд гравця в 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-паді геймпада.
Примітка
Ви можете переглянути та редагувати дії введення у вашому проєкті, перейшовши до та натиснувши на вкладку 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
//var velocity = Vector2.Up.Rotated(Rotation) * _speed;
//Position += velocity * (float)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", ми оновлюємо значення швидкості, змушуючи спрайт рухатися вперед.
Завершений скрипт
Ось повний файл 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
using Godot;
public partial class MySprite2D : 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.
Підсумок
В загальному, кожен скрипт у Godot представляє клас і розширює один із вбудованих класів рушія. Типи вузлів, від яких успадковують ваші класи, надають вам доступ до таких властивостей, як rotation та position у випадку нашого спрайта. Ви також успадковуєте багато функцій, які ми не використовували в цьому прикладі.
У GDScript змінні, які ви розміщуєте у верхній частині файлу, є властивостями вашого класу, які також називаються змінними-членами. Крім змінних, ви можете визначити функції, які, здебільшого, будуть методами ваших класів.
Godot надає кілька віртуальних функцій, які ви можете визначити, щоб підключити ваш клас до рушія. Вони включають _process(), щоб застосовувати зміни до вузла в кожному кадрі, і _unhandled_input(), щоб отримувати події введення, як-от натискання клавіш і кнопок від користувачів. Є ще чимало інших.
Синглтон Input дозволяє вам реагувати на ввід гравця будь-де у вашому коді. Зокрема, ви зможете використовувати його в циклі _process().
У наступному уроці, Використання сигналів,ми розглянемо зв’язок між скриптами та вузлами, змушуючи наші вузли запускати код у скриптах.