#define SDL_MAIN_USE_CALLBACKS 1 #include #include #include #include "core/system/director.hpp" #include "core/system/event_buffer.hpp" #include "core/system/relaunch.hpp" #include "utils/log.hpp" auto SDL_AppInit(void** appstate, int argc, char* argv[]) -> SDL_AppResult { // Desem argv perquè el menú de servei pugui demanar un reinici en calent // (execv) sense haver de conèixer ni Director ni main. System::Relaunch::setArgv(argc, argv); // Logger primer de tot perquè l'arrencada del Director ja emet logs. Log::init(); // Marcador d'inici: ha de ser la PRIMERA línia de log del programa. // `raw` per emetre el text pelat sense el prefix "tag: ". Log::raw(Log::Level::INFO, "Game start"); // Construïm el Director amb make_unique i l'entreguem en cru a SDL. // El SDL_AppQuit reclamarà la propietat amb un altre unique_ptr (RAII). auto director = std::make_unique(); *appstate = director.release(); return SDL_APP_CONTINUE; } auto SDL_AppEvent(void* appstate, SDL_Event* event) -> SDL_AppResult { (void)appstate; EventBuffer::events.push_back(*event); return SDL_APP_CONTINUE; } auto SDL_AppIterate(void* appstate) -> SDL_AppResult { auto* director = static_cast(appstate); return director->iterate(); } void SDL_AppQuit(void* appstate, SDL_AppResult result) { (void)result; // Reabsorbim la propietat: el destructor neteja l'escena; els singletons // (Screen, Cache) viuen fins a la destrucció estàtica i SDL_Quit dispara // via atexit després d'ells. { std::unique_ptr director(static_cast(appstate)); } // Si el menú va demanar reinici, fem execv ara que tot està net. En èxit // no torna (el procés és reemplaçat) i el "Bye!" no s'imprimeix — correcte, // no és una sortida. System::Relaunch::execIfRequested(); // Marcador de fi: ha de ser l'ÚLTIMA línia de log del programa. Log::raw(Log::Level::INFO, "Bye!"); }