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.

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ámetro | Tipo | Descripción |
|---|---|---|
actionId | integer | Identificador de la acción (0-15) |
tecla/pin | string/integer | Nombre 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ía | Teclas |
|---|---|
| Letras | A - Z |
| Números | 0 - 9 |
| Flechas | UP, DOWN, LEFT, RIGHT |
| Especiales | SPACE, ENTER, ESC, TAB |
| Modificadores | SHIFT, CTRL, ALT |
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ámetro | Tipo | Descripción |
|---|---|---|
actionId | integer | Identificador 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ámetro | Tipo | Descripción |
|---|---|---|
actionId | integer | Identificador 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
pressed(): Devuelvetrueen CADA frame mientras la tecla esté presionada. Útil para movimiento continuo.justPressed(): DevuelvetrueSOLO 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ámetro | Tipo | Descripción |
|---|---|---|
actionId | integer | Identificador 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()
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
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.
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
| Plataforma | Soporte | Notas |
|---|---|---|
| ESP32 | ✅ | Pines GPIO con INPUT_PULLUP |
| Windows (SDL2) | ✅ | Teclas de teclado via SDL |
| Emscripten (Web) | ✅ | Teclas de teclado via SDL |