Généralisation du chargement des niveaux

This commit is contained in:
Mattéo Delabre 2016-04-11 03:23:15 +02:00
parent 6b3237fd30
commit 2d62dd61ed
2 changed files with 82 additions and 46 deletions

View File

@ -36,7 +36,6 @@ private:
std::vector<sf::Vector2f> zone; std::vector<sf::Vector2f> zone;
protected: protected:
/** /**
* Dessine tous les objets et le fond à l'écran * Dessine tous les objets et le fond à l'écran
*/ */
@ -58,6 +57,12 @@ public:
Level(Manager& manager); Level(Manager& manager);
virtual ~Level(); 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 * Charge le niveau par défaut
*/ */

View File

@ -6,6 +6,7 @@
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <cstring> #include <cstring>
#include <functional>
#include <queue> #include <queue>
/** /**
@ -34,48 +35,20 @@ std::map<unsigned int, std::function<Object::Ptr(std::ifstream&)>> object_type_m
{GravityBlock::TYPE_ID, GravityBlock::load} {GravityBlock::TYPE_ID, GravityBlock::load}
}; };
Level::Level(Manager& manager) : State(manager) { /**
camera.setCenter(0, 0); * 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
Level::~Level() {} */
void loadLevel(
void Level::load() { std::string path, sf::String& name, int& total_time,
// métadonnées par défaut std::vector<sf::Vector2f>& zone,
name = sf::String("Nouveau niveau"); std::string& background, std::string& music,
current_file = ""; std::function<Object::Ptr(Object::Ptr)> object_callback = {}
total_time = 30; ) {
// ouverture du fichier
// 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::ifstream file; std::ifstream file;
std::string full_path = getResourceManager().getLevelPath(filename); file.open(path, std::ios::binary | std::ios::in);
// 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
);
// on vérifie que le fichier ait correctement été ouvert en lecture // on vérifie que le fichier ait correctement été ouvert en lecture
if (file.fail()) { if (file.fail()) {
@ -85,8 +58,7 @@ void Level::load(std::string filename) {
); );
} }
// lecture de la signture du fichier ("BAR") // lecture de la signature du fichier ("BAR")
current_file = filename;
char signature[3]; char signature[3];
file.read(signature, 3); file.read(signature, 3);
@ -138,9 +110,13 @@ void Level::load(std::string filename) {
std::getline(file, music, '\0'); std::getline(file, music, '\0');
std::getline(file, background, '\0'); std::getline(file, background, '\0');
// lecture des objets // lecture des objets si une callback a été fournie
int object_count; int object_count;
if (!object_callback) {
return;
}
file.read(reinterpret_cast<char*>(&object_count), 4); file.read(reinterpret_cast<char*>(&object_count), 4);
object_count = ntohl(object_count); object_count = ntohl(object_count);
@ -158,10 +134,65 @@ void Level::load(std::string filename) {
} }
// lecture de l'objet // 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<sf::Vector2f> 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) { void Level::save(std::string filename) {
std::ofstream file; std::ofstream file;
file.open( file.open(