diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index 4eea305..b7b9420 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -122,6 +122,15 @@ Director::~Director() { // Guardar opciones persistence_.save(); + // Destruir subsistemes en ordre invers a la construcció. Crític: el + // renderer i la finestra (dins de sdl_) han de morir abans de cridar + // SDL_Quit(). Si fossin destruïts pel destructor implícit del Director + // morirïen DESPRÉS dels Input/Audio/SDL_Quit que vénen a sota. + current_scene_.reset(); + debug_overlay_.reset(); + context_.reset(); + sdl_.reset(); + // Cleanup input Input::destroy(); @@ -227,7 +236,7 @@ auto Director::run() -> int { // Crear gestor SDL amb la engine_config + callback de persistència // per a quan toggleVSync (F4) muti vsync. Mantenim sdl_manager agnòstic. - SDLManager sdl(initial_width, initial_height, cfg_->window.fullscreen, *cfg_, [this] { persistence_.save(); }); + sdl_ = std::make_unique(initial_width, initial_height, cfg_->window.fullscreen, *cfg_, [this] { persistence_.save(); }); // CRÍTIC: Forçar ocultació del cursor DESPRÉS de toda la inicialización SDL // Això evita que SDL mostre el cursor automàticament durante la creació de la finestra @@ -255,30 +264,33 @@ auto Director::run() -> int { } // Crear context de escenes - SceneContext context; + context_ = std::make_unique(); #ifdef _DEBUG - context.setNextScene(SceneType::TITLE); + context_->setNextScene(SceneType::TITLE); #else - context.setNextScene(SceneType::LOGO); + context_->setNextScene(SceneType::LOGO); #endif // Overlay de debug (FPS + VSync). Vive en el Director porque es global // a todas las escenas. Toggle con F11 (visible por defecto en _DEBUG). - System::DebugOverlay debug_overlay(sdl.getRenderer(), cfg_->rendering); + debug_overlay_ = std::make_unique( + sdl_->getRenderer(), + cfg_->rendering); // Sistema de notificacions toast: singleton accessible des d'on calgui // (F1-F5 a sdl_manager, ESC a global_events). El renderer ha de viure // tant com el Notifier; el destruim explícitament abans de tornar. - System::Notifier::init(sdl.getRenderer()); + System::Notifier::init(sdl_->getRenderer()); // Bucle principal: construir escena → frame loop → destruir → siguiente. - while (context.nextScene() != SceneType::EXIT) { - SceneManager::actual = context.nextScene(); - std::unique_ptr scene = buildScene(context.nextScene(), sdl, context); - if (!scene) { + while (context_->nextScene() != SceneType::EXIT) { + SceneManager::actual = context_->nextScene(); + current_scene_ = buildScene(context_->nextScene(), *sdl_, *context_); + if (!current_scene_) { break; } - runFrameLoop(*scene, sdl, context, debug_overlay); + runFrameLoop(*current_scene_, *sdl_, *context_, *debug_overlay_); + current_scene_.reset(); } SceneManager::actual = SceneType::EXIT; diff --git a/source/core/system/director.hpp b/source/core/system/director.hpp index 712202a..206722a 100644 --- a/source/core/system/director.hpp +++ b/source/core/system/director.hpp @@ -32,6 +32,15 @@ class Director { Config::EngineConfig* cfg_; Config::ConfigPersistence persistence_; + // Subsistemes que viuen tant com el Director (abans eren locals de run()). + // Preparació per a la migració a SDL_MAIN_USE_CALLBACKS: amb les 4 + // callbacks de SDL3 no hi ha un scope que englobi tot el bucle, així + // que cal que aquest estat sigui membre del Director. + std::unique_ptr sdl_; + std::unique_ptr context_; + std::unique_ptr debug_overlay_; + std::unique_ptr current_scene_; + auto checkProgramArguments(std::vector const& args) -> std::string; void createSystemFolder(const std::string& folder);