#pragma once #include #include #include #include "core/config/engine_config.hpp" #include "scene_context.hpp" class Scene; class SDLManager; namespace System { class DebugOverlay; } class Director { public: // `cfg` ha de viure tant com el Director (típicament owned per main). // `persistence` encapsula init/load/save delegats a la capa concreta // (game/ConfigYaml::*). Director(std::vector const& args, Config::EngineConfig& cfg, Config::ConfigPersistence persistence); ~Director(); // Bucle principal del juego. auto run() -> int; private: std::string executable_path_; std::string system_folder_; Config::EngineConfig* cfg_; Config::ConfigPersistence persistence_; auto checkProgramArguments(std::vector const& args) -> std::string; void createSystemFolder(const std::string& folder); // Construye la escena correspondiente al tipo solicitado. Retorna // nullptr para EXIT u otros valores no constructibles. static auto buildScene(SceneManager::SceneContext::SceneType type, SDLManager& sdl, SceneManager::SceneContext& context) -> std::unique_ptr; // Ejecuta el bucle de frames de UNA escena hasta que scene.isFinished() // sea true. Maneja delta_time, eventos (globales + escena), update y draw. // El debug_overlay es global a todas las escenas; el Director lo posee. static void runFrameLoop(Scene& scene, SDLManager& sdl, SceneManager::SceneContext& context, System::DebugOverlay& debug_overlay); };