Capturando os controles de entrada do jogador

Com base na lição anterior Criando seu primeiro script, vamos ver outra característica importante de qualquer jogo: dar o controle ao jogador. Para adicionar isso, precisamos modificar nosso código Sprite.gd.

../../_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

Aqui está o arquivo Sprite.gd completo, para referência.

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

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

Em resumo, todo script em Godot representa uma classe e estende uma das classes internas do mecanismo. Os tipos de nó que suas classes herdam fornecem acesso a propriedades como rotation e position no caso do nosso sprite. Você também herda muitas funções, que não usamos neste exemplo.

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().

Na próxima lição Usando sinais, trataremos da ligação entre scripts e nós fazendo com que nossos nós acionem o código nos scripts.