From 2d62dd61ed90aecca22f65cfb62e096c474948e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Mon, 11 Apr 2016 03:23:15 +0200 Subject: [PATCH] =?UTF-8?q?G=C3=A9n=C3=A9ralisation=20du=20chargement=20de?= =?UTF-8?q?s=20niveaux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/level.hpp | 7 ++- src/level.cpp | 121 +++++++++++++++++++++++++++++----------------- 2 files changed, 82 insertions(+), 46 deletions(-) diff --git a/include/level.hpp b/include/level.hpp index a48ebd4..3ee3729 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -36,7 +36,6 @@ private: std::vector zone; protected: - /** * Dessine tous les objets et le fond à l'écran */ @@ -58,6 +57,12 @@ public: Level(Manager& manager); virtual ~Level(); + /** + * Obtient le nom du niveau dont le chemin complet + * et absolu est en paramètre + */ + static sf::String getLevelName(std::string path); + /** * Charge le niveau par défaut */ diff --git a/src/level.cpp b/src/level.cpp index a8f1a21..0889405 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include /** @@ -34,48 +35,20 @@ std::map> object_type_m {GravityBlock::TYPE_ID, GravityBlock::load} }; -Level::Level(Manager& manager) : State(manager) { - camera.setCenter(0, 0); -} - -Level::~Level() {} - -void Level::load() { - // métadonnées par défaut - name = sf::String("Nouveau niveau"); - current_file = ""; - total_time = 30; - - // zone de jeu par défaut - zone.clear(); - zone.push_back(sf::Vector2f(-128, -128)); - zone.push_back(sf::Vector2f(128, -128)); - zone.push_back(sf::Vector2f(128, 128)); - zone.push_back(sf::Vector2f(-128, 128)); - - // ressources par défaut - music = ""; - background = ""; - - // objets par défaut - // TODO: ajouter quelques objets par défaut -} - -void Level::load(std::string filename) { +/** + * Lecture du niveau dont le chemin absolu complet est en paramètre. + * Les métadonnées sont stockées dans les variables passées par référence. + * La callback object() est appelée séquentiellement avec les objets du niveau + */ +void loadLevel( + std::string path, sf::String& name, int& total_time, + std::vector& zone, + std::string& background, std::string& music, + std::function object_callback = {} +) { + // ouverture du fichier std::ifstream file; - std::string full_path = getResourceManager().getLevelPath(filename); - - // si le fichier n'existe pas, on utilise le niveau par défaut - if (!boost::filesystem::exists(full_path)) { - load(); - return; - } - - // sinon, on charge les propriétés depuis le fichier - file.open( - getResourceManager().getLevelPath(filename), - std::ios::binary | std::ios::in - ); + file.open(path, std::ios::binary | std::ios::in); // on vérifie que le fichier ait correctement été ouvert en lecture if (file.fail()) { @@ -85,8 +58,7 @@ void Level::load(std::string filename) { ); } - // lecture de la signture du fichier ("BAR") - current_file = filename; + // lecture de la signature du fichier ("BAR") char signature[3]; file.read(signature, 3); @@ -138,9 +110,13 @@ void Level::load(std::string filename) { std::getline(file, music, '\0'); std::getline(file, background, '\0'); - // lecture des objets + // lecture des objets si une callback a été fournie int object_count; + if (!object_callback) { + return; + } + file.read(reinterpret_cast(&object_count), 4); object_count = ntohl(object_count); @@ -158,10 +134,65 @@ void Level::load(std::string filename) { } // lecture de l'objet - addObject(object_type_map[object_type](file)); + object_callback(object_type_map[object_type](file)); } } +Level::Level(Manager& manager) : State(manager) { + camera.setCenter(0, 0); +} + +Level::~Level() {} + +sf::String Level::getLevelName(std::string path) { + sf::String name; + int total_time; + std::vector zone; + std::string background; + std::string music; + + loadLevel(path, name, total_time, zone, background, music); + return name; +} + +void Level::load() { + // métadonnées par défaut + name = sf::String("Nouveau niveau"); + current_file = ""; + total_time = 30; + + // zone de jeu par défaut + zone.clear(); + zone.push_back(sf::Vector2f(-128, -128)); + zone.push_back(sf::Vector2f(128, -128)); + zone.push_back(sf::Vector2f(128, 128)); + zone.push_back(sf::Vector2f(-128, 128)); + + // ressources par défaut + music = ""; + background = ""; + + // objets par défaut + // TODO: ajouter quelques objets par défaut +} + +void Level::load(std::string filename) { + std::string full_path = getResourceManager().getLevelPath(filename); + + // si le fichier n'existe pas, on utilise le niveau par défaut + if (!boost::filesystem::exists(full_path)) { + load(); + return; + } + + loadLevel( + full_path, name, total_time, + zone, background, music, + std::bind(&Level::addObject, this, std::placeholders::_1) + ); + current_file = filename; +} + void Level::save(std::string filename) { std::ofstream file; file.open(