refactor(director): locals de run() a membres unique_ptr

Preparació per a SDL_MAIN_USE_CALLBACKS: SDLManager, SceneContext,
DebugOverlay i l'escena actual ja viuen com a membres del Director.
El flux de run() és idèntic; només canvia el storage.
This commit is contained in:
2026-05-22 12:35:19 +02:00
parent 7fc8e48596
commit 8bb052981d
2 changed files with 32 additions and 11 deletions
+23 -11
View File
@@ -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<SDLManager>(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<SceneContext>();
#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<System::DebugOverlay>(
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> 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;