Chargement dynamique de la liste des niveaux dans le menu

This commit is contained in:
Mattéo Delabre 2016-04-11 03:50:08 +02:00
parent 2aafd24037
commit f8c87e1f76
5 changed files with 48 additions and 19 deletions

View File

@ -24,7 +24,7 @@ private:
GravityDirection gravity_direction; GravityDirection gravity_direction;
sf::String name; sf::String name;
std::string current_file; std::string current_path;
int total_time; int total_time;
sf::Sprite background_sprite; sf::Sprite background_sprite;
@ -69,9 +69,10 @@ public:
void load(); 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 * Écrase le niveau chargé avec les données en mémoire
@ -80,8 +81,9 @@ public:
/** /**
* Sauvegarde la configuration actuelle dans le fichier donné * 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é * Appelé par le manager lorsque l'état est utilisé

View File

@ -32,9 +32,10 @@ protected:
void launchEditor(); 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 * Quitte le jeu et le menu

View File

@ -54,6 +54,11 @@ public:
*/ */
std::string getLevelPath(std::string name); std::string getLevelPath(std::string name);
/**
* Récupère la liste de tous les niveaux
*/
std::vector<std::string> getLevelList();
/** /**
* Démarre la musique de fond donnée * Démarre la musique de fond donnée
*/ */

View File

@ -162,14 +162,13 @@ void Menu::loadLevelMenu() {
actions.clear(); actions.clear();
selection = 0; selection = 0;
choices.push_back(sf::String(L"Tutoriel")); std::vector<std::string> path_list = getResourceManager().getLevelList();
actions.push_back(std::bind(&Menu::launchGame, this, "level1.dat")); std::vector<std::string> name_list;
choices.push_back(sf::String(L"Niveau 1")); for (auto it = path_list.begin(); it != path_list.end(); it++) {
actions.push_back(std::bind(&Menu::launchGame, this, "level2.dat")); choices.push_back(Level::getLevelName(*it));
actions.push_back(std::bind(&Menu::launchGame, this, *it));
choices.push_back(sf::String(L"Niveau 2")); }
actions.push_back(std::bind(&Menu::launchGame, this, "level3.dat"));
choices.push_back(sf::String(L"Retour")); choices.push_back(sf::String(L"Retour"));
actions.push_back(std::bind(&Menu::loadMainMenu, this)); actions.push_back(std::bind(&Menu::loadMainMenu, this));
@ -182,14 +181,14 @@ void Menu::loadRules() {
void Menu::launchEditor() { void Menu::launchEditor() {
std::shared_ptr<Editor> editor = std::shared_ptr<Editor>(new Editor(getManager())); std::shared_ptr<Editor> editor = std::shared_ptr<Editor>(new Editor(getManager()));
// TODO: charger dynamiquement le niveau // TODO: charger dynamiquement le niveau dans l'éditeur
editor->load(); editor->load(getResourceManager().getLevelPath("editor_result.dat"));
getManager().setState(editor); getManager().setState(editor);
} }
void Menu::launchGame(std::string name) { void Menu::launchGame(std::string path) {
std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(getManager())); std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(getManager()));
game->load(name); game->load(path);
getManager().setState(game); getManager().setState(game);
} }

View File

@ -1,6 +1,6 @@
#include "resource_manager.hpp" #include "resource_manager.hpp"
#include <iostream> #include <iostream>
#include <cstring> #include <algorithm>
using dir_iter = boost::filesystem::directory_iterator; using dir_iter = boost::filesystem::directory_iterator;
using fs_path = boost::filesystem::path; using fs_path = boost::filesystem::path;
@ -88,7 +88,29 @@ sf::Font& ResourceManager::getFont(std::string name) {
} }
std::string ResourceManager::getLevelPath(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<std::string> ResourceManager::getLevelList() {
boost::filesystem::directory_iterator iter(levels_path);
std::vector<boost::filesystem::path> list;
std::vector<std::string> 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) { void ResourceManager::playMusic(std::string name) {