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...
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_2d.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.
Para girar, debemos utilizar una nueva variable: direction
. En nuestra función _process()
, sustituye la línea rotation += angular_speed * delta
por el código siguiente.
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;
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.
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;
}
}
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()
.
En la siguiente lección Usando Señales, ampliaremos la relación entre scripts y nodos haciendo que nuestros nodos activen código en scripts.