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; GravityDirection gravity_direction;
sf::String name; sf::String name;
std::string current_file;
int total_time; int total_time;
sf::Sprite background_sprite; sf::Sprite background_sprite;
@ -58,14 +59,24 @@ public:
virtual ~Level(); 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é * 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), Editor::Editor(Manager& manager) : Level(manager),
drag_control_point(nullptr), drag_mode(Editor::DragMode::NONE), drag_control_point(nullptr), drag_mode(Editor::DragMode::NONE),
widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)), widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)),
widget_toolbar(manager) { widget_toolbar(manager) {}
setName("Nouveau niveau");
setTotalTime(30);
}
Editor::~Editor() {} Editor::~Editor() {}

View File

@ -3,6 +3,7 @@
#include "player.hpp" #include "player.hpp"
#include "block.hpp" #include "block.hpp"
#include "gravity_block.hpp" #include "gravity_block.hpp"
#include <boost/filesystem.hpp>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <cstring> #include <cstring>
#include <queue> #include <queue>
@ -33,11 +34,44 @@ 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) {} Level::Level(Manager& manager) : State(manager) {
camera.setCenter(0, 0);
}
Level::~Level() {} 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) { void Level::load(std::string filename) {
std::ifstream file; 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( file.open(
getResourceManager().getLevelPath(filename), getResourceManager().getLevelPath(filename),
std::ios::binary | std::ios::in 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") // lecture de la signture du fichier ("BAR")
current_file = filename;
char signature[3]; char signature[3];
file.read(signature, 3); file.read(signature, 3);
if (strncmp(signature, "BAR", 3) != 0) { if (strncmp(signature, "BAR", 3) != 0) {
throw std::runtime_error( 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) { if (file_version != VERSION_NUMBER) {
throw std::runtime_error( 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 // pour éviter une erreur de segmentation
if (object_type_map.count(object_type) == 0) { if (object_type_map.count(object_type) == 0) {
throw std::runtime_error( 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() { void Level::begin() {
sf::Vector2u window_size = getWindow().getSize(); sf::Vector2u window_size = getWindow().getSize();
camera.setSize(window_size.x, window_size.y); camera.setSize(window_size.x, window_size.y);
camera_angle = 180.f; camera_angle = 180.f;
gravity_direction = GravityDirection::SOUTH; 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())); std::shared_ptr<Editor> editor = std::shared_ptr<Editor>(new Editor(getManager()));
// TODO: charger dynamiquement le niveau // TODO: charger dynamiquement le niveau
editor->load("level1.dat"); editor->load();
getManager().setState(editor); getManager().setState(editor);
} }