Up to date

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

Ejemplo de Input

Introducción

En este tutorial, aprenderás a utilizar el sistema InputEvent de Godot para capturar la entrada del reproductor. Hay muchos tipos diferentes de entrada que tu juego puede utilizar - teclado, gamepad, ratón, etc. - y muchas maneras diferentes de convertir esas entradas en acciones en tu juego. Este documento te mostrará algunos de los escenarios más comunes, que puedes usar como puntos de partida para tus propios proyectos.

Nota

Para una visión detallada de cómo funciona el sistema de eventos de entrada de Godot, ver Usando InputEvent.

Eventos vs polling

A veces quieres que tu juego responda a un determinado evento de entrada - pulsando el botón de "salto", por ejemplo. En otras situaciones, puede que quieras que algo suceda mientras se presiona una tecla, como el movimiento. En el primer caso, puedes usar la función input(), que será llamada siempre que ocurra un evento de entrada. En el segundo caso, Godot proporciona el singleton Input, que puedes usar para consultar el estado de una entrada.

Ejemplos:

func _input(event):
    if event.is_action_pressed("jump"):
        jump()


func _physics_process(delta):
    if Input.is_action_pressed("move_right"):
        # Move as long as the key/button is pressed.
        position.x += speed * delta

Esto le da la flexibilidad de mezclar y combinar el tipo de procesamiento de entrada que hace.

Para el resto de este tutorial, nos centraremos en la captura de eventos individuales en input().

Eventos de entrada

Los eventos de entrada son objetos que heredan de InputEvent. Dependiendo del tipo de evento, el objeto contendrá propiedades específicas relacionadas con ese evento. Para ver cómo son realmente los eventos, añade un Nodo y adjunta el siguiente script:

extends Node


func _input(event):
    print(event.as_text())

A medida que presionas las teclas, mueves el ratón y realizas otras entradas, verás cómo cada evento se desplaza por la ventana de salida. Aquí hay un ejemplo de la salida:

A
Mouse motion at position ((971, 5)) with velocity ((0, 0))
Right Mouse Button
Mouse motion at position ((870, 243)) with velocity ((0.454937, -0.454937))
Left Mouse Button
Mouse Wheel Up
A
B
Shift
Alt+Shift
Alt
Shift+T
Mouse motion at position ((868, 242)) with velocity ((-2.134768, 2.134768))

Como puedes ver, los resultados son muy diferentes para los diferentes tipos de entrada. Los eventos clave se imprimen incluso como sus símbolos clave. Por ejemplo, consideremos InputEventMouseButton. Hereda de las siguientes clases:

  • InputEvent - La clase base para todos los eventos de entrada

  • InputEventWithModifiers - agrega la habilidad de verificar si algunos modificadores fueron presionados, como Shift o Alt.

  • InputEventMouse - agrega propiedades de eventos de mouse, como position

  • InputEventMouseButton - contiene el índice del botón que fue presionado, si fue un doble clic, etc.

Truco

Es una buena idea mantener la referencia de la clase abierta mientras trabajas con los eventos para que puedas comprobar las propiedades y métodos disponibles del tipo de evento.

Puedes encontrar errores si intentas acceder a una propiedad en un tipo de entrada que no la contiene - llamando position en InputEventKey por ejemplo. Para evitar esto, asegúrate de probar primero el tipo de evento:

func _input(event):
    if event is InputEventMouseButton:
        print("mouse button event at ", event.position)

InputMap

The InputMap is the most flexible way to handle a variety of inputs. You use this by creating named input actions, to which you can assign any number of input events, such as keypresses or mouse clicks. To see them, and to add your own, open Project -> Project Settings and select the InputMap tab:

../../_images/inputs_inputmap.webp

Truco

A new Godot project includes a number of default actions already defined. To see them, turn on Show Built-in Actions in the InputMap dialog.

Capturando acciones

Una vez que hayas definido tus acciones, puedes procesarlas en tus scripts usando is_action_pressed() y is_action_released() pasando el nombre de la acción que estás buscando:

func _input(event):
    if event.is_action_pressed("my_action"):
        print("my_action occurred!")

Eventos de teclado

Los eventos de teclado son capturados en InputEventKey. Aunque se recomienda usar acciones de entrada en su lugar, puede haber casos en los que quieras mirar específicamente los eventos de teclado. Para este ejemplo, busquemos el T:

func _input(event):
    if event is InputEventKey and event.pressed:
        if event.keycode == KEY_T:
            print("T was pressed")

Truco

See @GlobalScope_Key for a list of keycode constants.

Advertencia

Debido al efecto ghosting del teclado, es posible que no se registren todas las pulsaciones de teclas al mismo tiempo si se presionan demasiadas teclas a la vez. Debido a su ubicación en el teclado, ciertas teclas son más propensas al efecto ghosting que otras. Algunos teclados cuentan con tecnología antighosting a nivel de hardware, pero esta característica generalmente no está presente en teclados de gama baja y teclados de laptop.

Como resultado, se recomienda utilizar un diseño de teclado predeterminado que esté diseñado para funcionar bien en un teclado sin tecnología antighosting. Consulta en Gamedev Stack Exchange para obtener más información al respecto.

Modificadores de teclado

Las propiedades de los modificadores se heredan de InputEventWithModifiers. Esto permite comprobar las combinaciones de modificadores usando propiedades booleanas. Imaginemos que quieres que ocurra una cosa cuando se presiona T, pero algo diferente cuando es Shift + T:

func _input(event):
    if event is InputEventKey and event.pressed:
        if event.keycode == KEY_T:
            if event.shift_pressed:
                print("Shift+T was pressed")
            else:
                print("T was pressed")

Truco

See @GlobalScope_Key for a list of keycode constants.

Eventos del ratón

Los eventos del ratón se derivan de la clase InputEventMouse, y se separan en dos tipos: InputEventMouseButton y InputEventMouseMotion. Ten en cuenta que esto significa que todos los eventos del ratón contendrán una propiedad de position.

Botones de mouse

Capturing mouse buttons is very similar to handling key events. @GlobalScope_MouseButton contains a list of MOUSE_BUTTON_* constants for each possible button, which will be reported in the event's button_index property. Note that the scrollwheel also counts as a button - two buttons, to be precise, with both MOUSE_BUTTON_WHEEL_UP and MOUSE_BUTTON_WHEEL_DOWN being separate events.

func _input(event):
    if event is InputEventMouseButton:
        if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
            print("Left button was clicked at ", event.position)
        if event.button_index == MOUSE_BUTTON_WHEEL_UP and event.pressed:
            print("Wheel up")

Movimiento del mouse

InputEventMouseMotion los eventos ocurren cada vez que el ratón se mueve. Puedes encontrar la distancia del movimiento con la propiedad relative.

Here's an example using mouse events to drag-and-drop a Sprite2D node:

extends Node


var dragging = false
var click_radius = 32 # Size of the sprite.


func _input(event):
    if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
        if (event.position - $Sprite2D.position).length() < click_radius:
            # Start dragging if the click is on the sprite.
            if not dragging and event.pressed:
                dragging = true
        # Stop dragging if the button is released.
        if dragging and not event.pressed:
            dragging = false

    if event is InputEventMouseMotion and dragging:
        # While dragging, move the sprite with the mouse.
        $Sprite2D.position = event.position

Eventos de toque

Si usas un dispositivo de pantalla táctil, puedes generar eventos táctiles. InputEventScreenTouch equivale a un evento de clic de ratón, y InputEventScreenDrag funciona de manera muy similar al movimiento del ratón.

Truco

Para probar los eventos táctiles en un dispositivo sin pantalla táctil, abra Configuración del proyecto y vaya a la sección "Dispositivos de entrada/punto". Habilita "Emular el toque del ratón" y tu proyecto interpretará los clics y el movimiento del ratón como eventos táctiles.