Escuchando la entrada del jugador¶
Building upon the previous lesson Creando tu primer 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.gd
code.

Tienes dos herramientas principales para procesar la entrada del jugador en Godot:
Los callbacks de entrada incorporados, principalmente
_unhandled_input()
. Al igual que_process()
, es una función virtual incorporada que Godot llama cada vez que el jugador presiona una tecla. Es la herramienta que desea usar para reaccionar ante eventos que no suceden en cada cuadro, como presionar Espacio para saltar. Para obtener más información sobre los callbacks de entrada, consulte Usando InputEvent.El singleton
Input
. Un singleton es un objeto accesible globalmente. Godot proporciona acceso a varios scripts. Es la herramienta adecuada para verificar para las entradas en cada frame.
Vamos a usar el singleton Input
aquí, ya que necesitamos saber si el jugador quiere girar o mover cada frame.
For turning, we should use a new variable: direction
. In our _process()
function, replace the rotation += angular_speed * delta
line with the
code below.
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 * delta;
Nuestra variable local direction
es un multiplicador que representa la dirección en la que el jugador quiere girar. Un valor de 0
significa que el jugador no está presionando la tecla de flecha izquierda o derecha. Un valor de 1
significa que el jugador quiere girar a la derecha, y -1
significa que quiere girar a la izquierda.
Para producir estos valores, introducimos condiciones y el uso de Input
. Una condición comienza con la palabra clave if
en GDScript y termina con dos puntos. La condición es la expresión entre las palabras clave y el final de la línea.
Para verificar si se presionó una tecla en este frame, llamamos Input.is_action_pressed()
. El método toma una cadena de texto que representa una acción de entrada y devuelve true
si se presiona la acción, false
de lo contrario.
Las dos acciones que usamos arriba, "ui_left" y "ui_right", están predefinidas en cada proyecto de Godot. Se activan respectivamente cuando el jugador presiona las flechas izquierda y derecha en el teclado o izquierda y derecha en el pad direccional de un gamepad.
Nota
Puede ver y editar acciones de entrada en su proyecto yendo a Proyecto -> Configuración del proyecto y haciendo clic en la pestaña Mapa de entrada.
Finalmente, usamos la direction
como un multiplicador cuando actualizamos la rotation
del nodo: rotation += angular_speed * direction * delta
.
Si ejecuta la escena con este código, el icono debería rotar cuando presione Izquierda y Derecha.
Moverse al presionar "arriba"¶
Para movernos solo al pulsar una tecla, necesitamos modificar el código que calcula la velocidad. Reemplace la línea que comienza con ``var velocity` con el siguiente código.
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 la velocity
con un valor de Vector2.ZERO
, otra constante incorporada del tipo Vector
que representa un vector 2D de longitud 0.
Si el jugador presiona la acción "ui_up", actualizamos el valor de la velocidad, lo que hace que el sprite se mueva hacia adelante.
Complete script¶
Aquí está el archivo Sprite.gd
completo como referencia.
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
using Godot;
public class Sprite : Godot.Sprite
{
private float Speed = 400;
private float AngularSpeed = Mathf.Pi;
public override void _Process(float delta)
{
var direction = 0;
if (Input.IsActionPressed("ui_left"))
{
direction = -1;
}
if (Input.IsActionPressed("ui_right"))
{
direction = 1;
}
Rotation += AngularSpeed * direction * delta;
var velocity = Vector2.Zero;
if (Input.IsActionPressed("ui_up"))
{
velocity = Vector2.Up.Rotated(Rotation) * Speed;
}
Position += velocity * delta;
}
}
Si ejecuta la escena, ahora debería poder rotar con las teclas de flecha izquierda y derecha y avanzar presionando Arriba.

Sumario¶
En resumen, cada script en Godot representa una clase y extiende una de las clases integradas del motor. Los tipos de nodos de los que heredan tus clases te dan acceso a propiedades como rotation
y position
en el caso de nuestro sprite. También heredas muchas función.
En GDScript, las variables que pones en la parte superior del archivo son las propiedades de su clase, también llamadas variables miembro. Además de las variables, puede definir funciones que, en su mayor parte, serán los métodos de sus clases.
Godot proporciona varias funciones virtuales que puedes definir para conectar tu clase con el motor. Estos incluyen _process()
, para aplicar cambios al nodo en cada cuadro, y _unhandled_input()
, para recibir eventos de entrada como pulsaciones de teclas y botones por parte de los usuarios. Hay bastantes más.
El singleton Input
le permite reaccionar a la entrada de los jugadores en cualquier parte de su código. En particular, podrás usarlo en el bucle _process()
.
In the next lesson Using signals, we'll build upon the relationship between scripts and nodes by having our nodes trigger code in scripts.