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; | ||||
| 
 | ||||
|     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é | ||||
|  |  | |||
|  | @ -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() {} | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue