Mémorisation du nom du fichier chargé, niveau par défaut
This commit is contained in:
parent
d6bc121c6f
commit
7cf8d24f91
|
@ -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é
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue