refactor(director): migra la persistència ConfigYaml al Director
main.cpp queda només amb 'Director director(argc, argv); return director.run()'. El Director crida ConfigYaml::* directament; l'struct ConfigPersistence desapareix de engine_config.hpp. La separació core/game es relaxa al Director, que és EL programa, no part del motor.
This commit is contained in:
@@ -12,7 +12,6 @@
|
||||
|
||||
#include <SDL3/SDL.h>
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
namespace Config {
|
||||
@@ -67,14 +66,4 @@ namespace Config {
|
||||
bool console{false};
|
||||
};
|
||||
|
||||
// Capa de persistència delegada cap a l'EngineConfig. Permet al Director
|
||||
// orquestrar init/load/save sense conèixer cap esquema concret (YAML,
|
||||
// SQLite, ...) ni la capa que el conté (`game/config_yaml.cpp`).
|
||||
struct ConfigPersistence {
|
||||
std::function<void()> init_defaults; // Restaura valors per defecte
|
||||
std::function<void(const std::string& path)> set_path; // Indica on guardar
|
||||
std::function<bool()> load; // Llegeix path → EngineConfig
|
||||
std::function<bool()> save; // Escriu EngineConfig → path
|
||||
};
|
||||
|
||||
} // namespace Config
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "core/system/notifier.hpp"
|
||||
#include "core/utils/path_utils.hpp"
|
||||
#include "debug_overlay.hpp"
|
||||
#include "game/config_yaml.hpp"
|
||||
#include "game/scenes/game_scene.hpp"
|
||||
#include "game/scenes/logo_scene.hpp"
|
||||
#include "game/scenes/title_scene.hpp"
|
||||
@@ -39,17 +40,15 @@ using SceneManager::SceneContext;
|
||||
using SceneType = SceneContext::SceneType;
|
||||
|
||||
// Constructor
|
||||
Director::Director(std::vector<std::string> const& args,
|
||||
Config::EngineConfig& cfg,
|
||||
Config::ConfigPersistence persistence)
|
||||
: cfg_(&cfg),
|
||||
persistence_(std::move(persistence)) {
|
||||
Director::Director(int argc, char* argv[])
|
||||
: cfg_(&ConfigYaml::engine_config) {
|
||||
std::cout << "Orni Attack - Inici\n";
|
||||
|
||||
// Inicialitzar opciones con valors per defecte
|
||||
persistence_.init_defaults();
|
||||
ConfigYaml::init();
|
||||
|
||||
// Comprovar arguments del programa
|
||||
// Convertir arguments a std::vector<std::string> i comprovar-los
|
||||
std::vector<std::string> args(argv, argv + argc);
|
||||
executable_path_ = checkProgramArguments(args);
|
||||
|
||||
// Inicialitzar sistema de rutes
|
||||
@@ -95,10 +94,10 @@ Director::Director(std::vector<std::string> const& args,
|
||||
createSystemFolder(std::string("jailgames/") + Project::NAME);
|
||||
|
||||
// Establir ruta del file de configuración
|
||||
persistence_.set_path(system_folder_ + "/config.yaml");
|
||||
ConfigYaml::setConfigFile(system_folder_ + "/config.yaml");
|
||||
|
||||
// Carregar o crear configuración
|
||||
persistence_.load();
|
||||
ConfigYaml::loadFromFile();
|
||||
|
||||
// Inicialitzar sistema de input
|
||||
Input::init("data/gamecontrollerdb.txt");
|
||||
@@ -120,7 +119,7 @@ Director::Director(std::vector<std::string> const& args,
|
||||
|
||||
Director::~Director() {
|
||||
// Guardar opciones
|
||||
persistence_.save();
|
||||
ConfigYaml::saveToFile();
|
||||
|
||||
// Destruir subsistemes en ordre invers a la construcció. Crític: el
|
||||
// renderer i la finestra (dins de sdl_) han de morir abans de cridar
|
||||
@@ -153,8 +152,8 @@ auto Director::checkProgramArguments(std::vector<std::string> const& args)
|
||||
cfg_->console = true;
|
||||
std::cout << "Mode consola activat\n";
|
||||
} else if (argument == "--reset-config") {
|
||||
persistence_.init_defaults();
|
||||
persistence_.save();
|
||||
ConfigYaml::init();
|
||||
ConfigYaml::saveToFile();
|
||||
std::cout << "Configuración restablida als valors per defecte\n";
|
||||
}
|
||||
}
|
||||
@@ -236,7 +235,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.
|
||||
sdl_ = std::make_unique<SDLManager>(initial_width, initial_height, cfg_->window.fullscreen, *cfg_, [this] { persistence_.save(); });
|
||||
sdl_ = std::make_unique<SDLManager>(initial_width, initial_height, cfg_->window.fullscreen, *cfg_, [] { ConfigYaml::saveToFile(); });
|
||||
|
||||
// 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
|
||||
|
||||
@@ -17,12 +17,10 @@ namespace System {
|
||||
|
||||
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<std::string> const& args,
|
||||
Config::EngineConfig& cfg,
|
||||
Config::ConfigPersistence persistence);
|
||||
// El Director és el programa: posseeix la configuració (via ConfigYaml)
|
||||
// i orquestra tots els subsistemes. main.cpp és pur tràmit que el
|
||||
// construeix i delega cap a SDL.
|
||||
Director(int argc, char* argv[]);
|
||||
~Director();
|
||||
|
||||
// Bucle principal del juego.
|
||||
@@ -41,8 +39,7 @@ class Director {
|
||||
private:
|
||||
std::string executable_path_;
|
||||
std::string system_folder_;
|
||||
Config::EngineConfig* cfg_;
|
||||
Config::ConfigPersistence persistence_;
|
||||
Config::EngineConfig* cfg_{nullptr};
|
||||
|
||||
// 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
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
//
|
||||
// La configuració runtime viu en Config::EngineConfig (core/config/).
|
||||
// Aquest fitxer afegeix una capa de persistència YAML que llegeix i
|
||||
// escriu aquesta struct a disc. La connexió amb el Director es fa via
|
||||
// Config::ConfigPersistence (lambdes a `main.cpp`), mantenint `core/`
|
||||
// agnòstic respecte d'aquesta capa.
|
||||
// escriu aquesta struct a disc. El Director crida ConfigYaml::* directament
|
||||
// (init / setConfigFile / loadFromFile / saveToFile): la separació
|
||||
// core/game queda relaxada al Director, que és EL programa, no part del motor.
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
+3
-24
@@ -1,33 +1,12 @@
|
||||
// main.cpp - Punt d'entrada de l'aplicació
|
||||
// © 2026 JailDesigner
|
||||
//
|
||||
// Aquí orquestrem la capa de persistència (YAML via game/ConfigYaml::*) i
|
||||
// injectem el resultat al Director. El Director queda independent de
|
||||
// game/config_yaml.hpp i pot operar només amb Config::EngineConfig.
|
||||
// El Director és EL programa: posseeix la configuració, els subsistemes i
|
||||
// el bucle. main.cpp només construeix el Director i delega.
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "core/config/engine_config.hpp"
|
||||
#include "core/system/director.hpp"
|
||||
#include "game/config_yaml.hpp"
|
||||
|
||||
auto main(int argc, char* argv[]) -> int {
|
||||
// Convertir arguments a std::vector<std::string>
|
||||
std::vector<std::string> args(argv, argv + argc);
|
||||
|
||||
// Capa de persistència delegada: lambdes prim que enllacen el contracte
|
||||
// de Config::ConfigPersistence amb la implementació YAML de ConfigYaml::*.
|
||||
const Config::ConfigPersistence PERSISTENCE{
|
||||
.init_defaults = [] { ConfigYaml::init(); },
|
||||
.set_path = [](const std::string& path) { ConfigYaml::setConfigFile(path); },
|
||||
.load = [] { return ConfigYaml::loadFromFile(); },
|
||||
.save = [] { return ConfigYaml::saveToFile(); },
|
||||
};
|
||||
|
||||
// El Director rep la struct d'engine_config + la capa de persistència.
|
||||
// No coneix ConfigYaml:: directament.
|
||||
Director director(args, ConfigYaml::engine_config, PERSISTENCE);
|
||||
|
||||
Director director(argc, argv);
|
||||
return director.run();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user