Saltar al contenido principal

Módulo Input

El módulo Input proporciona un sistema abstracto de entrada que permite manejar acciones del usuario de forma independiente de la plataforma. Mapea teclas del teclado (en Windows/Web) o pines GPIO (en ESP32) a "acciones" que pueden consultarse de manera uniforme.

JARU Input Module

Este enfoque permite escribir código portable que funciona tanto en el emulador de PC como en dispositivos ESP32, simplemente cambiando el mapeo de las acciones.

Uso

use Input

Conceptos clave

Acciones

El módulo Input trabaja con acciones identificadas por un número (0-15). Una acción representa una entrada abstracta del usuario como "saltar", "disparar" o "moverse a la izquierda".

// Definir constantes para las acciones
var ACCION_SALTAR = 0
var ACCION_DISPARAR = 1
var ACCION_IZQUIERDA = 2
var ACCION_DERECHA = 3

Mapeo por plataforma

En Windows/Web, las acciones se mapean a teclas del teclado. En ESP32, se mapean a pines GPIO configurados con resistencia pull-up interna.

// En Windows/Web: tecla SPACE para saltar
Input.map(ACCION_SALTAR, "SPACE")

// En ESP32: GPIO 15 para saltar (botón conectado a GND)
Input.map(ACCION_SALTAR, 15)

Funciones

map

La función map(actionId, tecla/pin) asocia una acción a una tecla del teclado o a un pin GPIO.

Parámetros

ParámetroTipoDescripción
actionIdintegerIdentificador de la acción (0-15)
tecla/pinstring/integerNombre de la tecla (Windows/Web) o número de pin GPIO (ESP32)

Retorno

Devuelve true si el mapeo fue exitoso.

// Mapear teclas para un juego
Input.map(0, "W") // Arriba
Input.map(1, "S") // Abajo
Input.map(2, "A") // Izquierda
Input.map(3, "D") // Derecha
Input.map(4, "SPACE") // Saltar
Input.map(5, "CTRL") // Disparar

Teclas soportadas (Windows/Web)

CategoríaTeclas
LetrasA - Z
Números0 - 9
FlechasUP, DOWN, LEFT, RIGHT
EspecialesSPACE, ENTER, ESC, TAB
ModificadoresSHIFT, CTRL, ALT
Pines GPIO en ESP32

En ESP32, los pines se configuran automáticamente como INPUT_PULLUP. Conecta el botón entre el pin y GND. El estado se invierte internamente, por lo que un botón presionado devuelve true.

pressed

La función pressed(actionId) comprueba si una acción está siendo presionada actualmente.

Parámetros

ParámetroTipoDescripción
actionIdintegerIdentificador de la acción (0-15)

Retorno

Devuelve true mientras la tecla/botón esté presionado, false en caso contrario.

// Movimiento continuo mientras se mantiene presionado
if (Input.pressed(2)) then
x = x - velocidad
end

if (Input.pressed(3)) then
x = x + velocidad
end

justPressed

La función justPressed(actionId) detecta el momento exacto en que una acción es presionada.

Parámetros

ParámetroTipoDescripción
actionIdintegerIdentificador de la acción (0-15)

Retorno

Devuelve true solo en el frame en que la tecla/botón pasa de no presionado a presionado.

// Acción única al presionar (no se repite mientras se mantiene)
if (Input.justPressed(4)) then
jugador.saltar()
end

if (Input.justPressed(5)) then
jugador.disparar()
end
Diferencia entre pressed y justPressed
  • pressed(): Devuelve true en CADA frame mientras la tecla esté presionada. Útil para movimiento continuo.
  • justPressed(): Devuelve true SOLO en el primer frame. Útil para acciones puntuales como saltar o disparar.

released

La función released(actionId) detecta el momento exacto en que una acción es liberada.

Parámetros

ParámetroTipoDescripción
actionIdintegerIdentificador de la acción (0-15)

Retorno

Devuelve true solo en el frame en que la tecla/botón pasa de presionado a no presionado.

// Detectar cuando se suelta un botón
if (Input.released(4)) then
// Cancelar el salto o reducir la altura
jugador.cancelarSalto()
end

update

La función update() fuerza una actualización manual del estado de las entradas.

// Normalmente no es necesario llamarla manualmente
// ya que pressed(), justPressed() y released()
// actualizan automáticamente el estado

Input.update()
Actualización automática

El sistema de entrada utiliza un mecanismo de "lazy update". El estado se actualiza automáticamente la primera vez que se consulta en cada frame. Solo necesitas llamar a update() si requieres forzar una actualización en un momento específico.

Ejemplo completo

Control de personaje

use Display
use Input

// Definir acciones
var ARRIBA = 0
var ABAJO = 1
var IZQUIERDA = 2
var DERECHA = 3
var SALTAR = 4
var DISPARAR = 5

// Configurar mapeo de teclas
Input.map(ARRIBA, "W")
Input.map(ABAJO, "S")
Input.map(IZQUIERDA, "A")
Input.map(DERECHA, "D")
Input.map(SALTAR, "SPACE")
Input.map(DISPARAR, "J")

// Variables del jugador
var x = 160
var y = 120
var velocidad = 2
var saltando = false

Display.open(320, 240)
Display.mode(2)

var draw = Display.draw

while (true)
// Movimiento continuo
if (Input.pressed(IZQUIERDA)) then
x = x - velocidad
end
if (Input.pressed(DERECHA)) then
x = x + velocidad
end
if (Input.pressed(ARRIBA)) then
y = y - velocidad
end
if (Input.pressed(ABAJO)) then
y = y + velocidad
end

// Acciones puntuales
if (Input.justPressed(SALTAR)) then
saltando = true
println("¡Saltando!")
end

if (Input.justPressed(DISPARAR)) then
println("¡Disparo!")
end

// Renderizar
draw.clear(0x000000)
draw.rectfill(x - 8, y - 8, x + 8, y + 8, 0x00FF00)
Display.update()

pause(16)
end

Control multiplataforma

use Input

// Definir acciones
var BTN_A = 0
var BTN_B = 1

// El mapeo puede hacerse en un archivo de configuración
// o detectando la plataforma

// Para Windows/Web:
Input.map(BTN_A, "Z")
Input.map(BTN_B, "X")

// Para ESP32 (descomentar según plataforma):
// Input.map(BTN_A, 15)
// Input.map(BTN_B, 14)

// El resto del código es idéntico en ambas plataformas
while (true)
if (Input.justPressed(BTN_A)) then
ejecutarAccionA()
end

if (Input.justPressed(BTN_B)) then
ejecutarAccionB()
end

pause(16)
end

Consideraciones

Límite de acciones

El sistema soporta un máximo de 16 acciones simultáneas (IDs del 0 al 15). Si necesitas más controles, considera usar combinaciones de teclas o un sistema de contextos donde las mismas acciones signifiquen cosas diferentes según el estado del juego.

Debounce en ESP32

En ESP32, los botones físicos pueden generar "rebotes" (múltiples pulsaciones rápidas al presionar). El módulo Input no incluye debounce por hardware. Si experimentas problemas, considera añadir condensadores de 100nF entre el pin y GND, o implementar un debounce por software.

Plataformas soportadas

PlataformaSoporteNotas
ESP32Pines GPIO con INPUT_PULLUP
Windows (SDL2)Teclas de teclado via SDL
Emscripten (Web)Teclas de teclado via SDL