Mémorisation du nom du fichier chargé, niveau par défaut

This commit is contained in:
Mattéo Delabre 2016-04-11 02:20:40 +02:00
parent d6bc121c6f
commit 7cf8d24f91
4 changed files with 63 additions and 20 deletions

View File

@ -24,6 +24,7 @@ private:
GravityDirection gravity_direction;
sf::String name;
std::string current_file;
int total_time;
sf::Sprite background_sprite;
@ -58,14 +59,24 @@ public:
virtual ~Level();
/**
* Charge un niveau de jeu avec le nom donné
* Charge le niveau par défaut
*/
virtual void load(std::string filename);
void load();
/**
* Sauvegarde la configuration actuelle dans le niveau donné
* Charge le niveau de jeu donné
*/
virtual void save(std::string filename);
void load(std::string filename);
/**
* Écrase le niveau chargé avec les données en mémoire
*/
void save();
/**
* Sauvegarde la configuration actuelle dans le fichier donné
*/
void save(std::string filename);
/**
* Appelé par le manager lorsque l'état est utilisé

View File

@ -29,11 +29,7 @@ inline sf::Vector2f roundVectorToGrid(sf::Vector2f input) {
Editor::Editor(Manager& manager) : Level(manager),
drag_control_point(nullptr), drag_mode(Editor::DragMode::NONE),
widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)),
widget_toolbar(manager) {
setName("Nouveau niveau");
setTotalTime(30);
}
widget_toolbar(manager) {}
Editor::~Editor() {}

View File

@ -3,6 +3,7 @@
#include "player.hpp"
#include "block.hpp"
#include "gravity_block.hpp"
#include <boost/filesystem.hpp>
#include <arpa/inet.h>
#include <cstring>
#include <queue>
@ -33,11 +34,44 @@ std::map<unsigned int, std::function<Object::Ptr(std::ifstream&)>> object_type_m
{GravityBlock::TYPE_ID, GravityBlock::load}
};
Level::Level(Manager& manager) : State(manager) {}
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) {
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
@ -51,18 +85,15 @@ void Level::load(std::string filename) {
);
}
// vidage du niveau précédent et positionnement
// de la caméra au centre du niveau
objects.clear();
camera.setCenter(0, 0);
// lecture de la signture du fichier ("BAR")
current_file = filename;
char signature[3];
file.read(signature, 3);
if (strncmp(signature, "BAR", 3) != 0) {
throw std::runtime_error(
"Impossible de lire le fichier : en-tête invalide"
"Impossible de charger le niveau \"" + name + "\" " +
"(en-tête invalide)"
);
}
@ -72,7 +103,8 @@ void Level::load(std::string filename) {
if (file_version != VERSION_NUMBER) {
throw std::runtime_error(
"Impossible de lire le fichier : version non prise en charge"
"Impossible de charger le niveau \"" + name + "\" " +
"(version non prise en charge)"
);
}
@ -120,7 +152,8 @@ void Level::load(std::string filename) {
// pour éviter une erreur de segmentation
if (object_type_map.count(object_type) == 0) {
throw std::runtime_error(
"Impossible de lire le fichier : type d'objet inconnu"
"Impossible de charger le niveau \"" + name + "\" " +
"(type d'objet " + std::to_string(object_type) + " inconnu)"
);
}
@ -192,11 +225,14 @@ void Level::save(std::string filename) {
}
}
void Level::save() {
save(current_file);
}
void Level::begin() {
sf::Vector2u window_size = getWindow().getSize();
camera.setSize(window_size.x, window_size.y);
camera_angle = 180.f;
gravity_direction = GravityDirection::SOUTH;
}

View File

@ -183,7 +183,7 @@ void Menu::launchEditor() {
std::shared_ptr<Editor> editor = std::shared_ptr<Editor>(new Editor(getManager()));
// TODO: charger dynamiquement le niveau
editor->load("level1.dat");
editor->load();
getManager().setState(editor);
}