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:
@@ -122,6 +122,15 @@ Director::~Director() {
|
|||||||
// Guardar opciones
|
// Guardar opciones
|
||||||
persistence_.save();
|
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
|
// Cleanup input
|
||||||
Input::destroy();
|
Input::destroy();
|
||||||
|
|
||||||
@@ -227,7 +236,7 @@ auto Director::run() -> int {
|
|||||||
|
|
||||||
// Crear gestor SDL amb la engine_config + callback de persistència
|
// Crear gestor SDL amb la engine_config + callback de persistència
|
||||||
// per a quan toggleVSync (F4) muti vsync. Mantenim sdl_manager agnòstic.
|
// 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
|
// 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
|
// 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
|
// Crear context de escenes
|
||||||
SceneContext context;
|
context_ = std::make_unique<SceneContext>();
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
context.setNextScene(SceneType::TITLE);
|
context_->setNextScene(SceneType::TITLE);
|
||||||
#else
|
#else
|
||||||
context.setNextScene(SceneType::LOGO);
|
context_->setNextScene(SceneType::LOGO);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Overlay de debug (FPS + VSync). Vive en el Director porque es global
|
// Overlay de debug (FPS + VSync). Vive en el Director porque es global
|
||||||
// a todas las escenas. Toggle con F11 (visible por defecto en _DEBUG).
|
// 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
|
// Sistema de notificacions toast: singleton accessible des d'on calgui
|
||||||
// (F1-F5 a sdl_manager, ESC a global_events). El renderer ha de viure
|
// (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.
|
// 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.
|
// Bucle principal: construir escena → frame loop → destruir → siguiente.
|
||||||
while (context.nextScene() != SceneType::EXIT) {
|
while (context_->nextScene() != SceneType::EXIT) {
|
||||||
SceneManager::actual = context.nextScene();
|
SceneManager::actual = context_->nextScene();
|
||||||
std::unique_ptr<Scene> scene = buildScene(context.nextScene(), sdl, context);
|
current_scene_ = buildScene(context_->nextScene(), *sdl_, *context_);
|
||||||
if (!scene) {
|
if (!current_scene_) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
runFrameLoop(*scene, sdl, context, debug_overlay);
|
runFrameLoop(*current_scene_, *sdl_, *context_, *debug_overlay_);
|
||||||
|
current_scene_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
SceneManager::actual = SceneType::EXIT;
|
SceneManager::actual = SceneType::EXIT;
|
||||||
|
|||||||
@@ -32,6 +32,15 @@ class Director {
|
|||||||
Config::EngineConfig* cfg_;
|
Config::EngineConfig* cfg_;
|
||||||
Config::ConfigPersistence persistence_;
|
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<SDLManager> sdl_;
|
||||||
|
std::unique_ptr<SceneManager::SceneContext> context_;
|
||||||
|
std::unique_ptr<System::DebugOverlay> debug_overlay_;
|
||||||
|
std::unique_ptr<Scene> current_scene_;
|
||||||
|
|
||||||
auto checkProgramArguments(std::vector<std::string> const& args)
|
auto checkProgramArguments(std::vector<std::string> const& args)
|
||||||
-> std::string;
|
-> std::string;
|
||||||
void createSystemFolder(const std::string& folder);
|
void createSystemFolder(const std::string& folder);
|
||||||
|
|||||||
Reference in New Issue
Block a user