#pragma once #include #include #include #include #include class Menu; class Text; class Texture; namespace Ja { struct Music; struct Sound; } // namespace Ja // Precarga y posee todos los recursos del juego durante toda la vida de la app. // Singleton inicializado desde Director; las escenas consultan handles via get*(). class Resource { public: static void init(SDL_Renderer *renderer); static void destroy(); static auto get() -> Resource *; auto getTexture(const std::string &name) -> Texture *; auto getSound(const std::string &name) -> Ja::Sound *; auto getMusic(const std::string &name) -> Ja::Music *; auto getAnimationLines(const std::string &name) -> std::vector &; auto getText(const std::string &name) -> Text *; // name sin extensión: "smb2", "nokia2", ... auto getMenu(const std::string &name) -> Menu *; // name sin extensión: "title", "options", ... [[nodiscard]] auto getDemoCount() const -> size_t { return demo_bytes_.size(); } [[nodiscard]] auto getDemoBytes(size_t index) const -> const std::vector & { return demo_bytes_.at(index); } private: explicit Resource(SDL_Renderer *renderer); ~Resource(); void preloadAll(); // Helpers de preloadAll void preloadResources(); void loadDataAsset(const std::string &bname, const std::vector &bytes); void preloadFonts(); void preloadMenus(); SDL_Renderer *renderer_; std::unordered_map textures_; std::unordered_map sounds_; std::unordered_map musics_; std::unordered_map> animation_lines_; std::unordered_map texts_; std::unordered_map menus_; std::vector> demo_bytes_; static Resource *instance; };