Listening to player input

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 для прыжка. Чтобы узнать больше об обратных вызовах ввода, посмотрите Использование InputEvent.

  2. The Input singleton. A singleton is a globally accessible object. Godot provides access to several in scripts. It's the right tool to check for input every frame.

We're going to use the Input singleton here as we need to know if the player wants to turn or move every frame.

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. Условие в GDScript начинается с ключевого слова if и заканчивается двоеточием. Условие - это выражение между ключевым словом и концом строки.

To check if a key was pressed this frame, we call Input.is_action_pressed(). The method takes a text string representing an input action and returns true if the action is pressed, false otherwise.

Два действия, которые мы использовали выше, «ui_left» и «ui_right», предопределены в каждом проекте Godot. Они соответственно срабатывают, когда игрок нажимает стрелки влево и вправо на клавиатуре или же влево и вправо на крестовине геймпада.

Примечание

Вы можете просматривать и редактировать действия ввода в своем проекте, перейдя в «Проект» -> «Настройки проекта» и щелкнув вкладку «Список действий».

Наконец, мы используем direction как множитель, когда обновляем rotation узла: rotation += angular_speed * direction * delta.

Если запустить сцену с этим кодом, иконка должна вращаться при нажатии Влево и Вправо.

Перемещение при нажатии "вверх"

Чтобы двигаться только при нажатии клавиши, нам нужно изменить код, который вычисляет скорость. Замените строку, начинающуюся с var velocity, на приведенный ниже код.

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

We initialize the velocity with a value of Vector2.ZERO, another constant of the built-in Vector type representing a 2D vector of length 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

Подведение итогов

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 like rotation and position in our sprite's case. You also inherit many functions, which we didn't get to use in this example.

In GDScript, the variables you put at the top of the file are your class's properties, also called member variables. Besides variables, you can define functions, which, for the most part, will be your classes' methods.

Godot provides several virtual functions you can define to connect your class with the engine. These include _process(), to apply changes to the node every frame, and _unhandled_input(), to receive input events like key and button presses from the users. There are quite a few more.

The Input singleton allows you to react to the players' input anywhere in your code. In particular, you'll get to use it in the _process() loop.

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