Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Escuchando la entrada del jugador

Basándonos en la lección anterior Creando tu primer script, vamos a ver otra característica importante de cualquier juego: dar el control al jugador. Para añadir esto, necesitaremos modificar nuestro código en sprite_2d.gd.

../../_images/scripting_first_script_moving_with_input.gif

Tienes dos herramientas principales para procesar la entrada del jugador en Godot:

  1. 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.

  2. 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

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

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

Aquí está el archivo sprite_2d.gd completo como referencia.

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

Si ejecuta la escena, ahora debería poder rotar con las teclas de flecha izquierda y derecha y avanzar presionando Arriba.

../../_images/scripting_first_script_moving_with_input.gif

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 funciones que no llegamos a utilizar en este ejemplo.

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.