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.
Você tem duas ferramentas principais para processar as entradas do jogador no Godot:
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.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
var direction = 0;
if (Input.IsActionPressed("ui_left"))
{
direction = -1;
}
if (Input.IsActionPressed("ui_right"))
{
direction = 1;
}
Rotation += _angularSpeed * direction * (float)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
var velocity = Vector2.Zero;
if (Input.IsActionPressed("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
using Godot;
public partial class Sprite : 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;
}
}
Se você executar a cena, agora poderá girar com as setas esquerda e direita e avançar pressionando Up.
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.