#pragma once #include // para string, basic_string #include // para vector #include "utils/utils.hpp" enum class AssetType : int { DATA, BITMAP, ANIMATION, MUSIC, SOUND, FONT, ROOM, TILEMAP, PALETTE, MAX_ASSET_TYPE }; // Clase Asset class Asset { private: // [SINGLETON] Objeto asset privado para Don Melitón static Asset* asset_; // Estructura para definir un item struct AssetItem { std::string file; // Ruta del fichero desde la raíz del directorio AssetType type; // Indica el tipo de recurso bool required; // Indica si es un fichero que debe de existir // Constructor AssetItem(const std::string& filePath, AssetType assetType, bool isRequired) : file(filePath), type(assetType), required(isRequired) {} }; // Variables int longest_name_ = 0; // Contiene la longitud del nombre de fichero mas largo std::vector file_list_; // Listado con todas las rutas a los ficheros std::string executable_path_; // Ruta al ejecutable // Comprueba que existe un fichero bool checkFile(const std::string& path) const; // Devuelve el nombre del tipo de recurso std::string getTypeName(AssetType type) const; // Constructor explicit Asset(const std::string& executable_path) : executable_path_(getPath(executable_path)) {} // Destructor ~Asset() = default; public: // [SINGLETON] Crearemos el objeto con esta función estática static void init(const std::string& executable_path); // [SINGLETON] Destruiremos el objeto con esta función estática static void destroy(); // [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él static Asset* get(); // Añade un elemento a la lista void add(const std::string& file, AssetType type, bool required = true, bool absolute = false); // Devuelve la ruta completa a un fichero a partir de una cadena std::string get(const std::string& text) const; // Comprueba que existen todos los elementos bool check() const; // Devuelve la lista de recursos de un tipo std::vector getListByType(AssetType type) const; };