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.

Capturando os controles de entrada do jogador

Building upon the previous lesson, Criando seu primeiro script, 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

Você tem duas ferramentas principais para processar as entradas do jogador no Godot:

  1. Os retornos de chamada de entrada embutidos, principalmente _unhandled_input(). Como _process(), é uma função virtual integrada que o Godot chama toda vez que o jogador pressiona uma tecla. É a ferramenta que você deve usar para reagir a eventos que não acontecem a cada quadro, como pressionar Espaço para pular. Para saber mais sobre callbacks de entrada, veja Usando InputEvent.

  2. O singleton Input. Um singleton é um objeto globalmente acessível. Godot fornece acesso a vários scripts. É a ferramenta certa para verificar a entrada a cada quadro.

Vamos usar o singleton Input aqui, pois precisamos saber se o jogador deseja virar ou mover em cada quadro processado.

Para virar, devemos usar uma nova variável: direction. Em nossa função _process(), substitua a linha rotation += angular_speed * delta pelo código abaixo.

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

Nossa variável local direction é um multiplicador que representa a direção em que o jogador quer virar. Um valor de 0 significa que o jogador não está pressionando a tecla de seta para a esquerda ou para a direita. Um valor de 1 significa que o jogador quer virar à direita, e -1 significa que quer virar à esquerda.

To produce these values, we introduce conditional statements and the use of Input. A conditional statement starts with the if keyword in GDScript and ends with a colon. The condition is specifically the expression between the keyword and the colon at the end of the line.

Para verificar se uma tecla foi pressionada neste quadro, chamamos Input.is_action_pressed(). O método pega uma string de texto representando uma ação de entrada e retorna true se a ação foi executada, false caso contrário.

As duas ações que usamos acima, "ui_left" e "ui_right", são predefinidas em cada projeto Godot. Eles são acionados, respectivamente, quando o jogador pressiona as setas esquerda e direita no teclado ou esquerda e direita no D-pad de um gamepad.

Nota

You can see and edit input actions in your project by going to Project > Project Settings and clicking on the Input Map tab.

Finalmente, usamos direction como um multiplicador quando atualizamos a rotation do nó: rotation += angular_speed * direction * delta.

Comente as linhas var velocity = Vector2.UP.rotated(rotation) * speed e``position += velocity * delta``dessa forma:

#var velocity = Vector2.UP.rotated(rotation) * speed

#position += velocity * delta

Isto irá ignorar o código que movia a posição do ícone em um círculo sem a interação do usuário, do exercício anterior.

Se você executar a cena com este código, o ícone deve girar quando você pressionar Esquerda e Direita.

Movendo-se ao pressionar "para cima"

To only move when pressing a key, we need to modify the code that calculates the velocity. Uncomment the code and replace the line starting with var velocity with the code below.

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

Inicializamos a velocity com um valor de Vector2.ZERO, outra constante do tipo Vector integrada que representa um vetor 2D de comprimento 0.

Se o jogador pressionar a seta para cima "ui_up", atualizamos o valor da velocidade, fazendo com que o sprite se mova para frente.

Script completo

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

Se você executar a cena, agora poderá girar com as setas esquerda e direita e avançar pressionando Up.

../../_images/scripting_first_script_moving_with_input.gif

Resumo

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.

No GDScript, as variáveis que você coloca no início do arquivo são as propriedades de sua classe, também chamadas de variáveis de membro. Além das variáveis, você pode definir funções, que, em sua maioria, serão os métodos de suas classes.

Godot fornece várias funções virtuais que você pode definir para conectar sua classe com a engine. Estes incluem _process(), para aplicar alterações ao nó a cada quadro, e _unhandled_input(), para receber eventos de entrada como teclas e botões pressionados pelos usuários. Existem mais algumas.

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

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