From f8c87e1f766a1a90a57b87bf78b8b93b726a6ff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Mon, 11 Apr 2016 03:50:08 +0200 Subject: [PATCH] Chargement dynamique de la liste des niveaux dans le menu --- include/level.hpp | 10 ++++++---- include/menu.hpp | 5 +++-- include/resource_manager.hpp | 5 +++++ src/menu.cpp | 21 ++++++++++----------- src/resource_manager.cpp | 26 ++++++++++++++++++++++++-- 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/include/level.hpp b/include/level.hpp index 3ee3729..fa87a44 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -24,7 +24,7 @@ private: GravityDirection gravity_direction; sf::String name; - std::string current_file; + std::string current_path; int total_time; sf::Sprite background_sprite; @@ -69,9 +69,10 @@ public: void load(); /** - * Charge le niveau de jeu donné + * Charge le niveau de jeu donné depuis le fichier + * dont le chemin complet absolu est en paramètre */ - void load(std::string filename); + void load(std::string path); /** * Écrase le niveau chargé avec les données en mémoire @@ -80,8 +81,9 @@ public: /** * Sauvegarde la configuration actuelle dans le fichier donné + * dont le chemin complet absolu est donné en paramètre */ - void save(std::string filename); + void save(std::string path); /** * Appelé par le manager lorsque l'état est utilisé diff --git a/include/menu.hpp b/include/menu.hpp index 9970aee..37cd940 100644 --- a/include/menu.hpp +++ b/include/menu.hpp @@ -32,9 +32,10 @@ protected: void launchEditor(); /** - * Démarre le jeu avec le niveau donné + * Démarre le jeu avec le niveau dont le chemin + * complet absolu est donné en paramètre */ - void launchGame(std::string name); + void launchGame(std::string path); /** * Quitte le jeu et le menu diff --git a/include/resource_manager.hpp b/include/resource_manager.hpp index e20d822..41744cc 100644 --- a/include/resource_manager.hpp +++ b/include/resource_manager.hpp @@ -54,6 +54,11 @@ public: */ std::string getLevelPath(std::string name); + /** + * Récupère la liste de tous les niveaux + */ + std::vector getLevelList(); + /** * Démarre la musique de fond donnée */ diff --git a/src/menu.cpp b/src/menu.cpp index 3a66ff9..d0f60fe 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -162,14 +162,13 @@ void Menu::loadLevelMenu() { actions.clear(); selection = 0; - choices.push_back(sf::String(L"Tutoriel")); - actions.push_back(std::bind(&Menu::launchGame, this, "level1.dat")); + std::vector path_list = getResourceManager().getLevelList(); + std::vector name_list; - choices.push_back(sf::String(L"Niveau 1")); - actions.push_back(std::bind(&Menu::launchGame, this, "level2.dat")); - - choices.push_back(sf::String(L"Niveau 2")); - actions.push_back(std::bind(&Menu::launchGame, this, "level3.dat")); + for (auto it = path_list.begin(); it != path_list.end(); it++) { + choices.push_back(Level::getLevelName(*it)); + actions.push_back(std::bind(&Menu::launchGame, this, *it)); + } choices.push_back(sf::String(L"Retour")); actions.push_back(std::bind(&Menu::loadMainMenu, this)); @@ -182,14 +181,14 @@ void Menu::loadRules() { void Menu::launchEditor() { std::shared_ptr editor = std::shared_ptr(new Editor(getManager())); - // TODO: charger dynamiquement le niveau - editor->load(); + // TODO: charger dynamiquement le niveau dans l'éditeur + editor->load(getResourceManager().getLevelPath("editor_result.dat")); getManager().setState(editor); } -void Menu::launchGame(std::string name) { +void Menu::launchGame(std::string path) { std::shared_ptr game = std::shared_ptr(new Game(getManager())); - game->load(name); + game->load(path); getManager().setState(game); } diff --git a/src/resource_manager.cpp b/src/resource_manager.cpp index 9eef57d..726ba0c 100644 --- a/src/resource_manager.cpp +++ b/src/resource_manager.cpp @@ -1,6 +1,6 @@ #include "resource_manager.hpp" #include -#include +#include using dir_iter = boost::filesystem::directory_iterator; using fs_path = boost::filesystem::path; @@ -88,7 +88,29 @@ sf::Font& ResourceManager::getFont(std::string name) { } std::string ResourceManager::getLevelPath(std::string name) { - return boost::filesystem::canonical(levels_path / name).string(); + return (levels_path / name).string(); +} + +std::vector ResourceManager::getLevelList() { + boost::filesystem::directory_iterator iter(levels_path); + std::vector list; + std::vector path_list; + + // récupération de la liste de tous les niveaux + std::copy( + iter, boost::filesystem::directory_iterator(), + std::back_inserter(list) + ); + + // tri par ordre alphabétique + std::sort(list.begin(), list.end()); + + // conversion en chemins absolus + for (auto it = list.begin(); it != list.end(); it++) { + path_list.push_back((*it).string()); + } + + return path_list; } void ResourceManager::playMusic(std::string name) {