From bc8baf0b8255dcda602f5e3439cb7bb987fb8ed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Fri, 29 Apr 2016 01:36:32 +0200 Subject: [PATCH] =?UTF-8?q?Correction=20du=20cache=20des=20images=20&=20ch?= =?UTF-8?q?angement=20ic=C3=B4ne=20musique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/resource_manager.hpp | 8 ++++---- src/gui/action_toolbar.cpp | 4 +++- src/gui/object_toolbar.cpp | 6 +++--- src/resource_manager.cpp | 31 +++++++++++-------------------- src/states/level.cpp | 10 ++++------ 5 files changed, 25 insertions(+), 34 deletions(-) diff --git a/include/resource_manager.hpp b/include/resource_manager.hpp index 75c0ed9..fddcf74 100644 --- a/include/resource_manager.hpp +++ b/include/resource_manager.hpp @@ -27,7 +27,7 @@ private: std::unordered_map< std::string, - std::weak_ptr + std::shared_ptr > images_cache; std::unordered_map< @@ -85,9 +85,9 @@ public: /** * Charge l'image dont le chemin est donné en paramètre */ - sfg::Image::Ptr getImage(boost::filesystem::path path); - sfg::Image::Ptr getImage(std::string name); - sfg::Image::Ptr getImage(const char* name); + std::shared_ptr getImage(boost::filesystem::path path); + std::shared_ptr getImage(std::string name); + std::shared_ptr getImage(const char* name); /** * Charge l'image dont le chemin est donné en paramètre diff --git a/src/gui/action_toolbar.cpp b/src/gui/action_toolbar.cpp index 26566ac..e021733 100644 --- a/src/gui/action_toolbar.cpp +++ b/src/gui/action_toolbar.cpp @@ -39,7 +39,9 @@ sfg::Button::Ptr ActionToolbar::createButton(std::string name) { // création d'un bouton avec pour image l'image passée sfg::Button::Ptr button = sfg::Button::Create(""); button->SetClass("icon"); - button->SetImage(ResourceManager::get().getImage(name + ".tga")); + button->SetImage(sfg::Image::Create( + *ResourceManager::get().getImage(name + ".tga") + )); return button; } diff --git a/src/gui/object_toolbar.cpp b/src/gui/object_toolbar.cpp index 46d1c0c..d4ab503 100644 --- a/src/gui/object_toolbar.cpp +++ b/src/gui/object_toolbar.cpp @@ -68,9 +68,9 @@ ObjectToolbar::ObjectToolbar() { void ObjectToolbar::addCreator(std::string path, std::function creator) { // on crée un bouton d'objet correspondant au créateur donné - ObjectButton::Ptr button = ObjectButton::Create( - ResourceManager::get().getImage(path + ".tga") - ); + ObjectButton::Ptr button = ObjectButton::Create(sfg::Image::Create( + *ResourceManager::get().getImage(path + ".tga") + )); creators[button] = creator; diff --git a/src/resource_manager.cpp b/src/resource_manager.cpp index 710920a..e2a628c 100644 --- a/src/resource_manager.cpp +++ b/src/resource_manager.cpp @@ -61,42 +61,33 @@ const fs::path& ResourceManager::getMusicsPath() const { return musics_path; } -sfg::Image::Ptr ResourceManager::getImage(fs::path path) { +std::shared_ptr ResourceManager::getImage(fs::path path) { std::string path_str = path.string(); - // si l'image a déjà été chargée, on retourne la - // version en cache mémoire + // si l'image a déjà été chargée, on renvoie la version en cache if (images_cache.count(path_str) > 0) { - // le cache d'images est constitué de pointeurs "faibles", càd - // 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(); - } + return images_cache[path_str]; } // on tente de charger l'image depuis son emplacement - sf::Image image; + auto image = std::shared_ptr(new sf::Image); - if (!image.loadFromFile(path_str)) { + if (!image->loadFromFile(path_str)) { std::cerr << "Impossible de charger l'image :" << std::endl; std::cerr << path_str << std::endl << std::endl; } - // création d'une nouvelle image SFGUI avec les infos chargées - // et mise en cache du résultat - sfg::Image::Ptr sfg_image = sfg::Image::Create(image); - images_cache[path_str] = sfg_image; - - return sfg_image; + // on met en cache l'image pour les requêtes suivantes + // puis on la renvoie + images_cache[path_str] = std::move(image); + return images_cache[path_str]; } -sfg::Image::Ptr ResourceManager::getImage(std::string name) { +std::shared_ptr ResourceManager::getImage(std::string name) { return getImage(images_path / name); } -sfg::Image::Ptr ResourceManager::getImage(const char* name) { +std::shared_ptr ResourceManager::getImage(const char* name) { return getImage(std::string(name)); } diff --git a/src/states/level.cpp b/src/states/level.cpp index 1f17780..941519f 100644 --- a/src/states/level.cpp +++ b/src/states/level.cpp @@ -282,16 +282,14 @@ void Level::frame() { sf::Vector2i window_size = (sf::Vector2i) window.getSize(); // mise à jour de l'icône du mute en fonction de l'état - sfg::Image::Ptr image; - if (ResourceManager::get().isMuted()) { - image = ResourceManager::get().getImage("no_music.tga"); + std::static_pointer_cast(mute_button->GetChild()) + ->SetImage(*ResourceManager::get().getImage("no_music.tga")); } else { - image = ResourceManager::get().getImage("music.tga"); + std::static_pointer_cast(mute_button->GetChild()) + ->SetImage(*ResourceManager::get().getImage("music.tga")); } - mute_button->SetImage(image); - // positionnement de la barre d'actions action_toolbar.getWindow()->SetAllocation(sf::FloatRect( 0, 0, window_size.x,