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