diff --git a/include/resource_manager.hpp b/include/resource_manager.hpp new file mode 100644 index 0000000..05cd04a --- /dev/null +++ b/include/resource_manager.hpp @@ -0,0 +1,23 @@ +#ifndef __PTF_RESOURCE_MANAGER_HPP__ +#define __PTF_RESOURCE_MANAGER_HPP__ + +#include +#include +#include + +class ResourceManager { +private: + std::map textures; + +public: + ~ResourceManager(); + + /** + * Récupère une image. Réutilise l'image déjà chargée + * si elle l'a déjà été, sinon, tente de la charger + * depuis son emplacement + */ + sf::Texture& getTexture(std::string name); +}; + +#endif diff --git a/src/resource_manager.cpp b/src/resource_manager.cpp new file mode 100644 index 0000000..3754640 --- /dev/null +++ b/src/resource_manager.cpp @@ -0,0 +1,50 @@ +#include "resource_manager.hpp" +#include + +// fonctionnalités cross-platform pour les fichiers +// source: http://stackoverflow.com/a/145309/3452708 +#include +#ifdef _WIN32 + #include + #define getcwd _getcwd + #define FILE_SEP '\\' +#else + #include + #define FILE_SEP '/' +#endif + +ResourceManager::~ResourceManager() { + textures.clear(); +} + +/** + * Récupère le chemin actuel de l'exécutable + * sous la forme d'une chaîne de caractères + */ +std::string getCurrentDirectory() { + char buffer[FILENAME_MAX]; + + if (getcwd(buffer, sizeof(buffer)) != NULL) { + return std::string(buffer); + } + + throw std::runtime_error("Impossible de déterminer le chemin actuel"); +} + +sf::Texture& ResourceManager::getTexture(std::string name) { + // si la texture est déjà chargée, on l'utilise directement + if (textures.count(name) > 0) { + return textures[name]; + } + + sf::Texture texture; + std::string path = getCurrentDirectory() + FILE_SEP + "res" + FILE_SEP + name; + + // tente de charger la texture dans le chemin "CWD/res/name" + if (!texture.loadFromFile(path)) { + throw std::runtime_error("Impossible de charger l'image: " + name); + } + + textures[name] = texture; + return textures[name]; +}