From 4a3953a1c6a5ea4affd32619eee6c5aabba1adcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sun, 10 Apr 2016 07:37:09 +0200 Subject: [PATCH] Correction du chargement --- include/block.hpp | 18 ++++++++++++++---- include/editor.hpp | 10 +++++----- include/gravity_block.hpp | 18 +++++++++++++++--- include/level.hpp | 6 +++--- include/object.hpp | 21 +++++++++++---------- include/player.hpp | 16 +++++++++++++--- src/block.cpp | 15 ++++++++------- src/editor.cpp | 28 ++++++++++++++-------------- src/game.cpp | 6 +++--- src/gravity_block.cpp | 19 +++++++++++-------- src/level.cpp | 8 ++++---- src/object.cpp | 14 ++++++-------- src/player.cpp | 16 +++++++++------- 13 files changed, 116 insertions(+), 79 deletions(-) diff --git a/include/block.hpp b/include/block.hpp index eff6891..a22a056 100644 --- a/include/block.hpp +++ b/include/block.hpp @@ -2,15 +2,25 @@ #define __PTF_BLOCK_HPP__ #include +#include #include "object.hpp" class Block : public Object { +public: + typedef std::shared_ptr Ptr; + private: - mutable sf::Sprite select_sprite; + sf::Sprite select_sprite; protected: mutable sf::Sprite sprite; + /** + * Initialisation des propriétés du bloc donné + * depuis le fichier donné + */ + static void init(std::ifstream& file, Object::Ptr object); + public: /** * Identifiant unique du type "bloc" @@ -23,7 +33,7 @@ public: /** * Clone ce bloc en un bloc avec les mêmes propriétés */ - virtual ObjectPtr clone() const; + virtual Object::Ptr clone() const; /** * Récupère la boîte englobante du bloc @@ -61,9 +71,9 @@ public: virtual CollisionType getCollisionType() const; /** - * Chargement du bloc depuis le fichier donné + * Chargement d'un bloc depuis le fichier donné */ - static ObjectPtr load(std::ifstream& file); + static Object::Ptr load(std::ifstream& file); /** * Sauvegarde le bloc dans le fichier donné diff --git a/include/editor.hpp b/include/editor.hpp index f761feb..da4fac2 100644 --- a/include/editor.hpp +++ b/include/editor.hpp @@ -15,7 +15,7 @@ enum class SelectionMode {REPLACE, FLIP, ADD}; */ class Editor : public Level { private: - std::vector selection; + std::vector selection; sf::Vector2i drag_start; sf::Vector2i drag_end; DragMode drag_mode; @@ -27,17 +27,17 @@ private: * Renvoie l'objet pointé à la position donnée * ou nullptr si aucun */ - ObjectPtr getObject(sf::Vector2f position); + Object::Ptr getObject(sf::Vector2f position); /** * Ajoute un objet du type actuel à la position donnée */ - ObjectPtr addObject(sf::Vector2f position); + Object::Ptr addObject(sf::Vector2f position); /** * Supprime l'objet à la position donnée ou passé par pointeur */ - void removeObject(ObjectPtr object); + void removeObject(Object::Ptr object); void removeObject(sf::Vector2f position); /** @@ -48,7 +48,7 @@ private: * - FLIP : sélectionne l'élément s'il ne l'est pas, sinon le désélectionne * - ADD : rajoute à la sélection courante */ - void select(ObjectPtr object, SelectionMode mode); + void select(Object::Ptr object, SelectionMode mode); void select(sf::Vector2f position, SelectionMode mode); void select(sf::Vector2f top_left, sf::Vector2f bottom_right); diff --git a/include/gravity_block.hpp b/include/gravity_block.hpp index dd1baa7..b5c0949 100644 --- a/include/gravity_block.hpp +++ b/include/gravity_block.hpp @@ -1,13 +1,25 @@ #ifndef __PTF_GRAVITY_BLOCK_HPP__ #define __PTF_GRAVITY_BLOCK_HPP__ +#include +#include #include "block.hpp" #include "level.hpp" class GravityBlock : public Block { +public: + typedef std::shared_ptr Ptr; + private: GravityDirection gravity_direction; +protected: + /** + * Initialisation des propriétés du bloc de gravité donné + * depuis le fichier donné + */ + static void init(std::ifstream& file, Object::Ptr object); + public: /** * Identifiant unique du type "bloc de gravité" @@ -20,7 +32,7 @@ public: /** * Clone ce bloc de gravité en un bloc de gravité avec les mêmes propriétés */ - virtual ObjectPtr clone() const; + virtual Object::Ptr clone() const; /** * Opérations de préparation de la texture du bloc @@ -38,9 +50,9 @@ public: virtual unsigned int getTypeId() const; /** - * Chargement du bloc de gravité depuis le fichier donné + * Chargement d'un bloc de gravité depuis le fichier donné */ - static ObjectPtr load(std::ifstream& file); + static Object::Ptr load(std::ifstream& file); /** * Sauvegarde le bloc de gravité dans le fichier donné diff --git a/include/level.hpp b/include/level.hpp index 07c4bc2..0f33785 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -29,7 +29,7 @@ private: std::string background; std::string music; - std::vector objects; + std::vector objects; std::vector> zone; protected: @@ -143,12 +143,12 @@ public: /** * Récupère la liste des objets */ - std::vector& getObjects(); + std::vector& getObjects(); /** * Récupère la liste des objets (version constante) */ - const std::vector& getObjects() const; + const std::vector& getObjects() const; /** * Récupère la zone du niveau diff --git a/include/object.hpp b/include/object.hpp index 86c8518..3270a8c 100644 --- a/include/object.hpp +++ b/include/object.hpp @@ -8,11 +8,12 @@ #include "manager.hpp" #include "resource_manager.hpp" -typedef std::shared_ptr ObjectPtr; - class Level; class Object { +public: + typedef std::shared_ptr Ptr; + private: sf::Vector2f acceleration; sf::Vector2f velocity; @@ -34,6 +35,12 @@ protected: */ virtual sf::Vector2f getForces(const Level& level) const; + /** + * Initialisation des propriétés communes à tous les objets + * depuis le fichier donné dans l'objet donné + */ + static void init(std::ifstream& file, Object::Ptr object); + public: /** * Identifiants uniques des propriétés communes modifiables @@ -51,7 +58,7 @@ public: /** * Clone cet objet en un objet avec les mêmes propriétés */ - virtual ObjectPtr clone() const = 0; + virtual Object::Ptr clone() const = 0; /** * Récupère la boîte englobante de l'objet @@ -83,12 +90,6 @@ public: */ virtual CollisionType getCollisionType() 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, ObjectPtr object); - /** * Sauvegarde cet objet dans le fichier donné */ @@ -238,7 +239,7 @@ public: * qui doit être dessinée avant celle du second */ struct ObjectCompare { - bool operator()(ObjectPtr const &t1, ObjectPtr const &t2) const; + bool operator()(Object::Ptr const &t1, Object::Ptr const &t2) const; }; #endif diff --git a/include/player.hpp b/include/player.hpp index 4095b73..6381af3 100644 --- a/include/player.hpp +++ b/include/player.hpp @@ -2,9 +2,13 @@ #define __PTF_PLAYER_HPP__ #include +#include #include "object.hpp" class Player : public Object { +public: + typedef std::shared_ptr Ptr; + private: mutable sf::CircleShape sprite; unsigned int player_number; @@ -15,6 +19,12 @@ protected: */ virtual sf::Vector2f getForces(const Level& level) const; + /** + * Initialisation des propriétés du joueur donné + * depuis le fichier donné + */ + static void init(std::ifstream& file, Object::Ptr object); + public: /** * Identifiant unique du type "joueur" @@ -27,7 +37,7 @@ public: /** * Clone ce joueur en un joueur avec les mêmes propriétés */ - virtual ObjectPtr clone() const; + virtual Object::Ptr clone() const; /** * Récupère la boîte englobante du joueur @@ -60,9 +70,9 @@ public: virtual CollisionType getCollisionType() const; /** - * Chargement du joueur depuis le fichier donné + * Chargement d'un joueur depuis le fichier donné */ - static ObjectPtr load(std::ifstream& file); + static Object::Ptr load(std::ifstream& file); /** * Sauvegarde le joueur dans le fichier donné diff --git a/src/block.cpp b/src/block.cpp index 71d7618..305af96 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -18,17 +18,18 @@ Block::Block() : Object() { Block::~Block() {} -ObjectPtr Block::clone() const { - return ObjectPtr(new Block(*this)); +Object::Ptr Block::clone() const { + return Object::Ptr(new Block(*this)); } -ObjectPtr Block::load(std::ifstream& file) { - ObjectPtr object = ObjectPtr(new Block); - +void Block::init(std::ifstream& file, Object::Ptr object) { // lecture des propriétés communes des objets - Object::load(file, object); - file.seekg(1, file.cur); + Object::init(file, object); +} +Object::Ptr Block::load(std::ifstream& file) { + Object::Ptr object = Object::Ptr(new Block); + Block::init(file, object); return object; } diff --git a/src/editor.cpp b/src/editor.cpp index c9fa930..cc07a61 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -58,7 +58,7 @@ void Editor::processEvent(const sf::Event& event) { if (event.type == sf::Event::MouseButtonPressed) { sf::Vector2i mouse_position(event.mouseButton.x, event.mouseButton.y); sf::Vector2f position = pixelToCoords(mouse_position); - ObjectPtr pointed_object = getObject(position); + Object::Ptr pointed_object = getObject(position); if (event.mouseButton.button == sf::Mouse::Left) { // clic + shift : sélection par rectangle de sélection @@ -107,7 +107,7 @@ void Editor::processEvent(const sf::Event& event) { if (event.type == sf::Event::MouseMoved) { sf::Vector2i mouse_position(event.mouseMove.x, event.mouseMove.y); sf::Vector2f position = pixelToCoords(mouse_position); - ObjectPtr pointed_object = getObject(position); + Object::Ptr pointed_object = getObject(position); drag_end = mouse_position; @@ -162,7 +162,7 @@ void Editor::processEvent(const sf::Event& event) { if (event.type == sf::Event::KeyPressed) { // appui sur suppr : suppression des blocs sélectionnés if (event.key.code == sf::Keyboard::Delete) { - std::vector& objects = getObjects(); + std::vector& objects = getObjects(); for (unsigned int i = 0; i < selection.size(); i++) { objects.erase(std::remove( @@ -244,8 +244,8 @@ void Editor::draw() { ); } -ObjectPtr Editor::getObject(sf::Vector2f position) { - std::vector& objects = getObjects(); +Object::Ptr Editor::getObject(sf::Vector2f position) { + std::vector& objects = getObjects(); for (unsigned int i = 0; i < objects.size(); i++) { if (objects[i]->getAABB().contains(position)) { @@ -256,8 +256,8 @@ ObjectPtr Editor::getObject(sf::Vector2f position) { return nullptr; } -ObjectPtr Editor::addObject(sf::Vector2f position) { - std::vector& objects = getObjects(); +Object::Ptr Editor::addObject(sf::Vector2f position) { + std::vector& objects = getObjects(); // on arrondit à l'unité de grille la plus proche position /= Constants::GRID; @@ -266,7 +266,7 @@ ObjectPtr Editor::addObject(sf::Vector2f position) { position *= Constants::GRID; // TODO: ajouter un objet du type choisi, pas uniquement de bloc - ObjectPtr object = ObjectPtr(new Block); + Object::Ptr object = Object::Ptr(new Block); object->setPosition(position); // avant d'ajouter l'objet, on vérifie qu'il ne soit @@ -287,12 +287,12 @@ ObjectPtr Editor::addObject(sf::Vector2f position) { return nullptr; } -void Editor::removeObject(ObjectPtr object) { +void Editor::removeObject(Object::Ptr object) { if (object == nullptr) { return; } - std::vector& objects = getObjects(); + std::vector& objects = getObjects(); // on supprime l'objet de la sélection selection.erase(std::remove( @@ -309,7 +309,7 @@ void Editor::removeObject(sf::Vector2f position) { removeObject(getObject(position)); } -void Editor::select(ObjectPtr object, SelectionMode mode) { +void Editor::select(Object::Ptr object, SelectionMode mode) { if (object == nullptr) { return; } @@ -342,7 +342,7 @@ void Editor::select(sf::Vector2f position, SelectionMode mode) { } void Editor::select(sf::Vector2f top_left, sf::Vector2f bottom_right) { - std::vector& objects = getObjects(); + std::vector& objects = getObjects(); sf::FloatRect selection_rect( std::min(top_left.x, bottom_right.x), std::min(top_left.y, bottom_right.y), @@ -369,7 +369,7 @@ void Editor::clearSelection() { } void Editor::selectAll() { - std::vector& objects = getObjects(); + std::vector& objects = getObjects(); for (unsigned int i = 0; i < objects.size(); i++) { objects[i]->setSelected(true); @@ -388,7 +388,7 @@ void Editor::test() { game->setMusic(getMusic()); // copie des objets du niveau vers le jeu - std::vector& objects = getObjects(); + std::vector& objects = getObjects(); for (unsigned int i = 0; i < objects.size(); i++) { game->getObjects().push_back(objects[i]->clone()); diff --git a/src/game.cpp b/src/game.cpp index 50b1cce..9595073 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -81,7 +81,7 @@ void Game::draw() { } void Game::ensureCentered() { - std::vector& objects = getObjects(); + std::vector& objects = getObjects(); sf::Vector2f total_position; int player_count = 0; @@ -111,10 +111,10 @@ void Game::update() { // détection des objets en collision for (unsigned int i = 0; i < getObjects().size(); i++) { - ObjectPtr obj_a = getObjects()[i]; + Object::Ptr obj_a = getObjects()[i]; for (unsigned int j = i + 1; j < getObjects().size(); j++) { - ObjectPtr obj_b = getObjects()[j]; + Object::Ptr obj_b = getObjects()[j]; CollisionData data(*obj_a, *obj_b); if (obj_a->detectCollision(*obj_b, data)) { diff --git a/src/gravity_block.cpp b/src/gravity_block.cpp index 1d943bb..0df611d 100644 --- a/src/gravity_block.cpp +++ b/src/gravity_block.cpp @@ -6,8 +6,8 @@ const unsigned int GravityBlock::TYPE_ID = 3; GravityBlock::GravityBlock() : Block() {} GravityBlock::~GravityBlock() {} -ObjectPtr GravityBlock::clone() const { - return ObjectPtr(new GravityBlock(*this)); +Object::Ptr GravityBlock::clone() const { + return Object::Ptr(new GravityBlock(*this)); } void GravityBlock::beforeDraw(Level& level) { @@ -51,18 +51,21 @@ unsigned int GravityBlock::getTypeId() const { return TYPE_ID; } -ObjectPtr GravityBlock::load(std::ifstream& file) { +void GravityBlock::init(std::ifstream& file, Object::Ptr object) { + GravityBlock::Ptr gravity_block = std::dynamic_pointer_cast(object); + // lecture de la direction de la gravité char gravity_direction; file.read(&gravity_direction, 1); + gravity_block->setGravityDirection((GravityDirection) gravity_direction); // lecture des propriétés d'un bloc - ObjectPtr object = Block::load(file); - std::shared_ptr block = std::dynamic_pointer_cast(object); - - // attribution de la direction - block->setGravityDirection((GravityDirection) gravity_direction); + Block::init(file, object); +} +Object::Ptr GravityBlock::load(std::ifstream& file) { + Object::Ptr object = Object::Ptr(new GravityBlock); + GravityBlock::init(file, object); return object; } diff --git a/src/level.cpp b/src/level.cpp index 26b2709..8e0a16e 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -29,7 +29,7 @@ const unsigned int VERSION_NUMBER = 0; * à des instances qui seront utilisées pour la * construction d'autres objets de ces types */ -std::map> object_type_map = { +std::map> object_type_map = { {Player::TYPE_ID, Player::load}, {Block::TYPE_ID, Block::load}, {GravityBlock::TYPE_ID, GravityBlock::load} @@ -222,7 +222,7 @@ void Level::draw() { window.draw(background_sprite); // chargement de la file d'affichage des objets - std::priority_queue, ObjectCompare> display_queue; + std::priority_queue, ObjectCompare> display_queue; for (unsigned int i = 0; i < objects.size(); i++) { display_queue.push(objects[i]); @@ -322,11 +322,11 @@ void Level::setGravityDirection(GravityDirection set_gravity_direction) { gravity_direction = set_gravity_direction; } -std::vector& Level::getObjects() { +std::vector& Level::getObjects() { return objects; } -const std::vector& Level::getObjects() const { +const std::vector& Level::getObjects() const { return objects; } diff --git a/src/object.cpp b/src/object.cpp index b6de8fa..b670972 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -32,7 +32,7 @@ Object::Object() : Object::~Object() {} -void Object::load(std::ifstream& file, ObjectPtr object) { +void Object::init(std::ifstream& file, Object::Ptr object) { // lecture de la position de l'objet float pos_x, pos_y; @@ -85,9 +85,7 @@ void Object::load(std::ifstream& file, ObjectPtr object) { break; default: - // propriété de type inconnu : on recule - // d'un octet et on sort - file.seekg(-1, file.cur); + // propriété de type inconnu : on sort return; } } @@ -137,7 +135,7 @@ void Object::save(std::ofstream& file) const { if (layer != DEFAULT_LAYER) { prop_type = Object::PROP_LAYER; file.write(&prop_type, 1); - + char write_layer = layer + 127; file.write(&write_layer, 1); } @@ -149,7 +147,7 @@ void Object::save(std::ofstream& file) const { sf::Vector2f Object::getForces(const Level& level) const { sf::Vector2f forces(0, 0); - const std::vector& objects = level.getObjects(); + const std::vector& objects = level.getObjects(); // force de gravité forces += getMass() * level.getGravity(); @@ -157,7 +155,7 @@ sf::Vector2f Object::getForces(const Level& level) const { // force d'attraction entre objets chargés if (getCharge() != 0) { for (unsigned int j = 0; j < objects.size(); j++) { - ObjectPtr attractive = objects[j]; + Object::Ptr attractive = objects[j]; if (attractive.get() == this || attractive->getCharge() == 0) { continue; @@ -384,7 +382,7 @@ void Object::setLayer(int set_layer) { layer = set_layer; } -bool ObjectCompare::operator()(ObjectPtr const &t1, ObjectPtr const &t2) const { +bool ObjectCompare::operator()(Object::Ptr const &t1, Object::Ptr const &t2) const { sf::Vector2f t1_pos = t1->getPosition(); sf::Vector2f t2_pos = t2->getPosition(); diff --git a/src/player.cpp b/src/player.cpp index 70f5bad..0284876 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -14,13 +14,12 @@ Player::Player() : Object() { Player::~Player() {} -ObjectPtr Player::clone() const { - return ObjectPtr(new Player(*this)); +Object::Ptr Player::clone() const { + return Object::Ptr(new Player(*this)); } -ObjectPtr Player::load(std::ifstream& file) { - ObjectPtr object = ObjectPtr(new Player); - std::shared_ptr player = std::dynamic_pointer_cast(object); +void Player::init(std::ifstream& file, Object::Ptr object) { + Player::Ptr player = std::dynamic_pointer_cast(object); // lecture du numéro de joueur char player_number; @@ -28,9 +27,12 @@ ObjectPtr Player::load(std::ifstream& file) { player->setPlayerNumber(player_number); // lecture des propriétés communes des objets - Object::load(file, object); - file.seekg(1, file.cur); + Object::init(file, object); +} +Object::Ptr Player::load(std::ifstream& file) { + Object::Ptr object = Object::Ptr(new Player); + Player::init(file, object); return object; }