Correction du cache des images & changement icône musique

This commit is contained in:
Mattéo Delabre 2016-04-29 01:36:32 +02:00
parent fc7457bef7
commit bc8baf0b82
5 changed files with 25 additions and 34 deletions

View File

@ -27,7 +27,7 @@ private:
std::unordered_map< std::unordered_map<
std::string, std::string,
std::weak_ptr<sfg::Image> std::shared_ptr<sf::Image>
> images_cache; > images_cache;
std::unordered_map< std::unordered_map<
@ -85,9 +85,9 @@ public:
/** /**
* Charge l'image dont le chemin est donné en paramètre * Charge l'image dont le chemin est donné en paramètre
*/ */
sfg::Image::Ptr getImage(boost::filesystem::path path); std::shared_ptr<sf::Image> getImage(boost::filesystem::path path);
sfg::Image::Ptr getImage(std::string name); std::shared_ptr<sf::Image> getImage(std::string name);
sfg::Image::Ptr getImage(const char* name); std::shared_ptr<sf::Image> getImage(const char* name);
/** /**
* Charge l'image dont le chemin est donné en paramètre * Charge l'image dont le chemin est donné en paramètre

View File

@ -39,7 +39,9 @@ sfg::Button::Ptr ActionToolbar::createButton(std::string name) {
// création d'un bouton avec pour image l'image passée // création d'un bouton avec pour image l'image passée
sfg::Button::Ptr button = sfg::Button::Create(""); sfg::Button::Ptr button = sfg::Button::Create("");
button->SetClass("icon"); button->SetClass("icon");
button->SetImage(ResourceManager::get().getImage(name + ".tga")); button->SetImage(sfg::Image::Create(
*ResourceManager::get().getImage(name + ".tga")
));
return button; return button;
} }

View File

@ -68,9 +68,9 @@ ObjectToolbar::ObjectToolbar() {
void ObjectToolbar::addCreator(std::string path, std::function<Object::Ptr()> creator) { void ObjectToolbar::addCreator(std::string path, std::function<Object::Ptr()> creator) {
// on crée un bouton d'objet correspondant au créateur donné // on crée un bouton d'objet correspondant au créateur donné
ObjectButton::Ptr button = ObjectButton::Create( ObjectButton::Ptr button = ObjectButton::Create(sfg::Image::Create(
ResourceManager::get().getImage(path + ".tga") *ResourceManager::get().getImage(path + ".tga")
); ));
creators[button] = creator; creators[button] = creator;

View File

@ -61,42 +61,33 @@ const fs::path& ResourceManager::getMusicsPath() const {
return musics_path; return musics_path;
} }
sfg::Image::Ptr ResourceManager::getImage(fs::path path) { std::shared_ptr<sf::Image> ResourceManager::getImage(fs::path path) {
std::string path_str = path.string(); std::string path_str = path.string();
// si l'image a déjà été chargée, on retourne la // si l'image a déjà été chargée, on renvoie la version en cache
// version en cache mémoire
if (images_cache.count(path_str) > 0) { if (images_cache.count(path_str) > 0) {
// le cache d'images est constitué de pointeurs "faibles", càd return images_cache[path_str];
// que dès que la ressource n'est plus utilisée, le pointeur
// s'invalide. Ceci parce que SFGUI maintient son propre cache.
// on doit donc d'abord vérifier que le pointeur est toujours valide
if (!images_cache[path_str].expired()) {
return images_cache[path_str].lock();
}
} }
// on tente de charger l'image depuis son emplacement // on tente de charger l'image depuis son emplacement
sf::Image image; auto image = std::shared_ptr<sf::Image>(new sf::Image);
if (!image.loadFromFile(path_str)) { if (!image->loadFromFile(path_str)) {
std::cerr << "Impossible de charger l'image :" << std::endl; std::cerr << "Impossible de charger l'image :" << std::endl;
std::cerr << path_str << std::endl << std::endl; std::cerr << path_str << std::endl << std::endl;
} }
// création d'une nouvelle image SFGUI avec les infos chargées // on met en cache l'image pour les requêtes suivantes
// et mise en cache du résultat // puis on la renvoie
sfg::Image::Ptr sfg_image = sfg::Image::Create(image); images_cache[path_str] = std::move(image);
images_cache[path_str] = sfg_image; return images_cache[path_str];
return sfg_image;
} }
sfg::Image::Ptr ResourceManager::getImage(std::string name) { std::shared_ptr<sf::Image> ResourceManager::getImage(std::string name) {
return getImage(images_path / name); return getImage(images_path / name);
} }
sfg::Image::Ptr ResourceManager::getImage(const char* name) { std::shared_ptr<sf::Image> ResourceManager::getImage(const char* name) {
return getImage(std::string(name)); return getImage(std::string(name));
} }

View File

@ -282,16 +282,14 @@ void Level::frame() {
sf::Vector2i window_size = (sf::Vector2i) window.getSize(); sf::Vector2i window_size = (sf::Vector2i) window.getSize();
// mise à jour de l'icône du mute en fonction de l'état // mise à jour de l'icône du mute en fonction de l'état
sfg::Image::Ptr image;
if (ResourceManager::get().isMuted()) { if (ResourceManager::get().isMuted()) {
image = ResourceManager::get().getImage("no_music.tga"); std::static_pointer_cast<sfg::Image>(mute_button->GetChild())
->SetImage(*ResourceManager::get().getImage("no_music.tga"));
} else { } else {
image = ResourceManager::get().getImage("music.tga"); std::static_pointer_cast<sfg::Image>(mute_button->GetChild())
->SetImage(*ResourceManager::get().getImage("music.tga"));
} }
mute_button->SetImage(image);
// positionnement de la barre d'actions // positionnement de la barre d'actions
action_toolbar.getWindow()->SetAllocation(sf::FloatRect( action_toolbar.getWindow()->SetAllocation(sf::FloatRect(
0, 0, window_size.x, 0, 0, window_size.x,