skizzle/src/resource_manager.cpp

75 lines
1.9 KiB
C++
Raw Normal View History

2016-03-22 19:03:19 +00:00
#include "resource_manager.hpp"
#include "whereami.h"
2016-03-24 16:20:13 +00:00
#include <memory>
#define RESOURCE_PATH
2016-03-22 19:03:19 +00:00
#ifdef _WIN32
#define FILE_SEP '\\'
#else
#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 grâce à la librairie whereami
2016-03-22 19:03:19 +00:00
*/
std::string getCurrentDirectory() {
int length = wai_getExecutablePath(NULL, 0, NULL), dirname_length;
2016-03-30 12:02:06 +00:00
std::unique_ptr<char[]> buffer = std::make_unique<char[]>(length + 1);
2016-03-24 13:47:09 +00:00
wai_getExecutablePath(buffer.get(), length, &dirname_length);
2016-03-22 19:03:19 +00:00
if (dirname_length == 0) {
throw std::runtime_error("Impossible de déterminer le chemin actuel");
2016-03-22 19:03:19 +00:00
}
2016-03-24 13:47:09 +00:00
buffer.get()[length] = '\0';
return std::string(buffer.get()).substr(0, dirname_length);
2016-03-22 19:03:19 +00:00
}
/**
* Récupère le chemin absolu vers la ressource dont
* le nom est passé en argument
*/
inline std::string getResourcePath(std::string name) {
return getCurrentDirectory() + FILE_SEP + "res" + FILE_SEP + name;
}
2016-03-22 19:03:19 +00:00
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;
// tente de charger la texture dans le chemin "CWD/res/name"
if (!texture.loadFromFile(getResourcePath(name))) {
2016-03-24 19:11:25 +00:00
throw std::runtime_error("Impossible de charger l'image : " + name);
2016-03-22 19:03:19 +00:00
}
textures[name] = texture;
return textures[name];
}
void ResourceManager::setMusic(std::string name) {
if (!music.openFromFile(getResourcePath(name))) {
throw std::runtime_error("Impossible de charger la musique : " + name);
}
}
void ResourceManager::playMusic() {
music.play();
}
void ResourceManager::pauseMusic() {
music.pause();
}
void ResourceManager::stopMusic() {
music.stop();
}