From 6ae0b14adfb70835982da2bd8a1525bfdc52b215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sat, 9 Apr 2016 03:53:17 +0200 Subject: [PATCH] Activations d'objets --- include/block.hpp | 19 ++++++++++++------- include/object.hpp | 31 ++++++++++++++++++------------- include/player.hpp | 39 ++++++++++++++++++++++----------------- src/block.cpp | 6 ++++++ src/object.cpp | 5 +++++ src/player.cpp | 8 +++++++- 6 files changed, 70 insertions(+), 38 deletions(-) diff --git a/include/block.hpp b/include/block.hpp index cfdb60d..49be13a 100644 --- a/include/block.hpp +++ b/include/block.hpp @@ -11,7 +11,7 @@ private: public: /** - * Identifiant unique du type d'objet + * Identifiant unique du type "bloc" */ static const unsigned int TYPE_ID; @@ -19,14 +19,14 @@ public: virtual ~Block(); /** - * Clone cet objet en un objet avec les mêmes propriétés + * Clone ce bloc en un bloc avec les mêmes propriétés */ virtual ObjectPtr clone() const; /** - * Chargement de l'objet depuis le fichier donné + * Récupère la boîte englobante du bloc */ - static ObjectPtr load(std::ifstream& file); + virtual std::unique_ptr getAABB() const; /** * Dessin du bloc dans la fenêtre donnée @@ -34,14 +34,19 @@ public: virtual void draw(Manager& manager); /** - * Récupère la boîte englobante de l'objet + * Appelé lorsque le bloc est activé par un objet */ - virtual std::unique_ptr getAABB() const; + virtual void activated(Object& object); /** - * Récupère l'identifiant de type de cet objet + * Récupère l'identifiant de type des blocs */ virtual unsigned int getTypeId() const; + + /** + * Chargement du bloc depuis le fichier donné + */ + static ObjectPtr load(std::ifstream& file); }; #endif diff --git a/include/object.hpp b/include/object.hpp index 9541978..3d427fa 100644 --- a/include/object.hpp +++ b/include/object.hpp @@ -52,16 +52,31 @@ public: virtual ObjectPtr clone() const = 0; /** - * Charge les propriétés communes à tous les objets - * depuis le fichier donné dans l'objet donné + * Récupère la boîte englobante de l'objet */ - static void load(std::ifstream& file, ObjectPtr object); + virtual std::unique_ptr getAABB() const = 0; /** * Dessine l'objet dans la fenêtre donnée */ virtual void draw(Manager& manager) = 0; + /** + * Appelé lorsque l'objet est activé par un autre + */ + virtual void activated(Object& object) = 0; + + /** + * Récupère l'identifiant de type de cet objet + */ + virtual unsigned int getTypeId() 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); + /** * Met à jour la vitesse de l'objet selon les * forces qui lui sont appliquées @@ -97,16 +112,6 @@ public: */ virtual void positionalCorrection(Object& obj, const sf::Vector2f& normal, float depth); - /** - * Récupère la boîte englobante de l'objet - */ - virtual std::unique_ptr getAABB() const = 0; - - /** - * Récupère l'identifiant de type de cet objet - */ - virtual unsigned int getTypeId() const = 0; - /** * Récupère l'accélération de l'objet */ diff --git a/include/player.hpp b/include/player.hpp index bc5cef7..b31957e 100644 --- a/include/player.hpp +++ b/include/player.hpp @@ -11,13 +11,13 @@ private: protected: /** - * Calcule les forces appliquées à l'objet + * Calcule les forces appliquées au joueur */ virtual sf::Vector2f getForces(const Manager& manager, const std::vector& objects) const; public: /** - * Identifiant unique du type d'objet + * Identifiant unique du type "joueur" */ static const unsigned int TYPE_ID; @@ -25,20 +25,35 @@ public: virtual ~Player(); /** - * Clone cet objet en un objet avec les mêmes propriétés + * Clone ce joueur en un joueur avec les mêmes propriétés */ virtual ObjectPtr clone() const; /** - * Chargement de l'objet depuis le fichier donné + * Récupère la boîte englobante du joueur */ - static ObjectPtr load(std::ifstream& file); + virtual std::unique_ptr getAABB() const; /** - * Dessine la balle dans la fenêtre donnée + * Dessine le joueur dans la fenêtre donnée */ virtual void draw(Manager& manager); + /** + * Appelé lorsque le joueur est activé par un objet + */ + virtual void activated(Object& object); + + /** + * Récupère l'identifiant de type des joueurs + */ + virtual unsigned int getTypeId() const; + + /** + * Chargement du joueur depuis le fichier donné + */ + static ObjectPtr load(std::ifstream& file); + /** * Met à jour la position de l'objet selon sa * vitesse actuelle @@ -46,17 +61,7 @@ public: virtual void updatePosition(float delta); /** - * Récupère la boîte englobante de l'objet - */ - virtual std::unique_ptr getAABB() const; - - /** - * Récupère l'identifiant de type de cet objet - */ - virtual unsigned int getTypeId() const; - - /** - * Renvoie le rayon de la balle + * Renvoie le rayon de la balle du joueur */ float getRadius() const; diff --git a/src/block.cpp b/src/block.cpp index 98bdbc3..ce6215a 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -58,6 +58,12 @@ void Block::draw(Manager& manager) { } } +void Block::activated(Object& object) { + // ne rien faire si le bloc est activé. + // Ceci est un bloc de base qui n'a pas a réagir + // aux activations +} + std::unique_ptr Block::getAABB() const { return std::unique_ptr(new sf::FloatRect( getPosition().x - Constants::GRID / 2, diff --git a/src/object.cpp b/src/object.cpp index c5e67dd..c6a4bfb 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -174,6 +174,11 @@ void Object::solveCollision(Object& obj, const sf::Vector2f& normal) { return; } + // en ce point, on est bertins qu'une collision a eu lieu. + // activation réciproque des deux objets + activated(obj); + obj.activated(*this); + // on utilise le plus petit coefficient de friction entre les // deux objets comme le coefficient de la collision float restitution = std::min(getRestitution(), obj.getRestitution()); diff --git a/src/player.cpp b/src/player.cpp index 76d65a2..6cdc9f0 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -68,7 +68,7 @@ void Player::draw(Manager& manager) { &manager.getResourceManager().getTexture("player.tga") ); - // si le joueur est sélectionné, on le colore en rouge vif + // si le joueur est sélectionné, on met sa bordure en rouge // if (isSelected()) { // sprite.setColor(sf::Color(255, 0, 0)); // } else { @@ -85,6 +85,12 @@ void Player::draw(Manager& manager) { manager.getWindow().draw(sprite); } +void Player::activated(Object& object) { + // ne rien faire si le joueur est activé. + // en règle générale, c'est l'objet activé par le joueur + // qui s'occupe de la réponse +} + void Player::updatePosition(float delta){ // calcul de la différence de position pour connaître // (approximativement) la rotation de la balle