diff --git a/include/block.hpp b/include/block.hpp index bdc7c9e..7a24a1b 100644 --- a/include/block.hpp +++ b/include/block.hpp @@ -17,10 +17,15 @@ public: Block(); virtual ~Block(); + /** + * Clone cet objet en un objet avec les mêmes propriétés + */ + virtual ObjectPtr clone() const; + /** * Chargement de l'objet depuis le fichier donné */ - static std::shared_ptr load(std::ifstream& file); + static ObjectPtr load(std::ifstream& file); /** * Dessin du bloc dans la fenêtre donnée diff --git a/include/object.hpp b/include/object.hpp index c342e2f..4d0f016 100644 --- a/include/object.hpp +++ b/include/object.hpp @@ -45,11 +45,16 @@ public: Object(); virtual ~Object(); + /** + * Clone cet objet en un objet avec les mêmes propriétés + */ + virtual ObjectPtr clone() const = 0; + /** * Charge les propriétés communes à tous les objets * depuis le fichier donné dans l'objet donné */ - static void load(std::ifstream& file, std::shared_ptr object); + static void load(std::ifstream& file, ObjectPtr object); /** * Dessine l'objet dans la fenêtre donnée diff --git a/include/player.hpp b/include/player.hpp index 766705e..13b8fa5 100644 --- a/include/player.hpp +++ b/include/player.hpp @@ -24,16 +24,21 @@ public: Player(); virtual ~Player(); + /** + * Clone cet objet en un objet avec les mêmes propriétés + */ + virtual ObjectPtr clone() const; + /** * Chargement de l'objet depuis le fichier donné */ - static std::shared_ptr load(std::ifstream& file); + static ObjectPtr load(std::ifstream& file); /** * Dessine la balle dans la fenêtre donnée */ virtual void draw(Manager& manager); - + /** * Met à jour la position de l'objet selon sa * vitesse actuelle diff --git a/src/block.cpp b/src/block.cpp index c434fea..d7064ba 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -16,8 +16,12 @@ Block::Block() : Object() { Block::~Block() {} -std::shared_ptr Block::load(std::ifstream& file) { - std::shared_ptr object = std::shared_ptr(new Block); +ObjectPtr Block::clone() const { + return ObjectPtr(new Block(*this)); +} + +ObjectPtr Block::load(std::ifstream& file) { + ObjectPtr object = ObjectPtr(new Block); // lecture des propriétés communes des objets Object::load(file, object); diff --git a/src/editor.cpp b/src/editor.cpp index 79a346c..77761d3 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -106,7 +106,7 @@ void Editor::addObject(sf::Vector2f position) { position *= Constants::GRID; // TODO: ajouter un objet du type choisi, pas uniquement de bloc - std::shared_ptr object = std::shared_ptr(new Block); + ObjectPtr object = ObjectPtr(new Block); object->setPosition(position); // avant d'ajouter l'objet, on vérifie qu'il ne soit @@ -180,7 +180,7 @@ void Editor::testLevel() { std::vector& objects = getObjects(); for (unsigned int i = 0; i < objects.size(); i++) { - game->getObjects().push_back(objects[i]); + game->getObjects().push_back(objects[i]->clone()); } // copie de la zone de jeu diff --git a/src/level.cpp b/src/level.cpp index 3e70378..4b5d1bb 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -12,7 +12,7 @@ * à des instances qui seront utilisées pour la * construction d'autres objets de ces types */ -std::map(std::ifstream&)>> object_type_map = { +std::map> object_type_map = { {Player::TYPE_ID, Player::load}, {Block::TYPE_ID, Block::load} }; diff --git a/src/object.cpp b/src/object.cpp index a0a280e..aaa535d 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -23,7 +23,7 @@ Object::Object() : Object::~Object() {} -void Object::load(std::ifstream& file, std::shared_ptr object) { +void Object::load(std::ifstream& file, ObjectPtr object) { // lecture de la position de l'objet float pos_x, pos_y; diff --git a/src/player.cpp b/src/player.cpp index 997ad8d..360e6db 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -13,8 +13,12 @@ Player::Player() : Object() { Player::~Player() {} -std::shared_ptr Player::load(std::ifstream& file) { - std::shared_ptr object = std::shared_ptr(new Player); +ObjectPtr Player::clone() const { + return ObjectPtr(new Player(*this)); +} + +ObjectPtr Player::load(std::ifstream& file) { + ObjectPtr object = ObjectPtr(new Player); std::shared_ptr player = std::dynamic_pointer_cast(object); // lecture du numéro de joueur