Funcionamiento del motor de juegos
Cómo fluye el código por frame — archivos reales: main.cpp, motor.cpp, pantalla.hpp, lua_api.cpp
1 · El bucle principal (setup → loop, 60 fps)
setup() — una vez
buttonsInit() → shift register
audioInit() → I2S0 (MAX98357A)
pantalla.init(320,480)
lua_newstate(psram) + registerApi
callInit(L) → init() del juego
loop() — se repite cada frame (60 fps)
1. readShiftRegister()
8 botones → 3 pines serie
2. setButtons(state, edge)
→ variables btnState / btnEdge
3. callUpdate(L, dt)
ejecuta update(dt) del juego en Lua
4. pantalla.present()
framebuffer → LCD_CAM → pantalla
vuelve a empezar
Dentro de update(dt): el juego Lua llama a la API, que ejecuta C++
Lua: clear(0x001F) ──► C++: Framebuffer::clear()
Lua: spr(id, x, y) ──► C++: Framebuffer::drawSprite()
Lua: mode7(...) ──► C++: Framebuffer::mode7()
2 · Capas del motor (quién depende de quién)
HARDWARE
LCD_CAM · I2S · GPIO
ST7365P · MAX98357A
DRIVERS (ajenos)
LovyanGFX (LCD_CAM)
ESP-IDF i2s · GPIO
NÚCLEO (motor.cpp)
Framebuffer (PSRAM doble)
clear·rect·line·drawSprite
API LUA
clear·spr·mode7
btn·btnp·dt·text
JUEGO
main.lua
init() update(dt)
motor.cpp es puro C++ sin hardware → se testea en el Mac (18 pruebas).
pantalla.hpp y lua_api.cpp solo compilan en ESP32 (#ifdef ESP_PLATFORM).
hardware
drivers ajenos
núcleo
API Lua
juego