Files

51 lines
1.5 KiB
C++

#pragma once
#include <SDL3/SDL.h>
#include <cstdint>
#include <memory>
#include <string>
#include "game/scenes/scene_flow.hpp"
class Scene;
class Surface;
class Text;
class Director {
public:
Director();
~Director();
auto iterate() -> SDL_AppResult;
private:
std::string system_folder_;
std::unique_ptr<Scene> current_scene_;
std::uint64_t last_ticks_ms_{0};
// Recursos compartits per la fabricació d'escenes. S'instancien una
// vegada al ctor (parsejant fnt's, retenint shared_ptrs del
// Resource::Cache) i `buildScene` els passa pel valor a cada nova
// escena. No són `static`/Meyers perquè depenen de l'inici d'SDL i
// de Resource::Cache.
std::shared_ptr<Text> placeholder_text_;
std::shared_ptr<Text> copyright_text_;
std::shared_ptr<Surface> title_bg_surface_;
std::shared_ptr<Surface> game_logo_surface_;
std::shared_ptr<Surface> mini_logo_surface_;
std::shared_ptr<Surface> logo_full_surface_;
void createSystemFolder();
void processEvents();
static void processGamepadEvents();
static void processMenuInput();
void switchSceneIfRequested();
// Fabrica una escena nova a partir d'un identificador i els seus
// paràmetres. És l'únic punt del codi que coneix com construir cada
// tipus concret d'escena, així les escenes només declaren `ExitRequest`
// i no s'enllacen entre si.
[[nodiscard]] auto buildScene(SceneId id, const SceneParams& params) -> std::unique_ptr<Scene>;
};