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.
Checking the stable version of the documentation...
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.
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 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
//var velocity = Vector2.Up.Rotated(Rotation) * _speed;
//Position += velocity * (float)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
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 MySprite2D : 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.
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.