Up to date

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

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.

Para produzir esses valores, introduzimos condições e o uso de Input. Uma condição começa com a palavra-chave if no GDScript e termina com dois pontos. A condição é a expressão entre a palavra-chave e o final da linha.

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

Você pode ver e editar ações de entrada em seu projeto acessando Projeto -> Configurações do Projeto e clicando na guia Mapa de Entrada.

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

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"

Para mover apenas pressionando uma tecla, precisamos modificar o código que calcula a velocidade. Substitua a linha que começa com var velocity pelo código abaixo.

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.

O singleton Input permite que você reaja à entrada dos jogadores em qualquer lugar do seu código. Em particular, você poderá usá-lo no loop _process().

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