From a7cd6235e78423e9b8744530c7167c753fa34571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Mon, 11 Apr 2016 16:32:19 +0200 Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20des=20comportements=20des?= =?UTF-8?q?=20blocs=20tueurs=20et=20changeurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/block.hpp | 2 +- include/finish_block.hpp | 2 +- include/game.hpp | 5 +++++ include/gravity_block.hpp | 2 +- include/kill_block.hpp | 2 +- include/object.hpp | 22 ++++++++++++++++------ include/player.hpp | 2 +- include/switch_block.hpp | 2 +- src/block.cpp | 2 +- src/finish_block.cpp | 2 +- src/game.cpp | 8 ++++++-- src/gravity_block.cpp | 2 +- src/kill_block.cpp | 9 +++++++-- src/object.cpp | 17 ++++++++++++----- src/player.cpp | 2 +- src/switch_block.cpp | 8 ++++++-- 16 files changed, 62 insertions(+), 27 deletions(-) diff --git a/include/block.hpp b/include/block.hpp index 5d3eb02..c715662 100644 --- a/include/block.hpp +++ b/include/block.hpp @@ -62,7 +62,7 @@ public: /** * Appelé lorsque le bloc est activé par un objet */ - virtual void activate(Game& game, Object* object); + virtual void activate(Game& game, Object::Ptr object); /** * Appelé lorsque le bloc a été tué. Si cette fonction diff --git a/include/finish_block.hpp b/include/finish_block.hpp index dd053a4..f864556 100644 --- a/include/finish_block.hpp +++ b/include/finish_block.hpp @@ -39,7 +39,7 @@ public: /** * Appelé lorsque le bloc d'arrivée est activé par un objet */ - virtual void activate(Game& game, Object* object); + virtual void activate(Game& game, Object::Ptr object); /** * Récupère l'identifiant de type des blocs d'arrivée diff --git a/include/game.hpp b/include/game.hpp index 62ca548..8044c2d 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -75,6 +75,11 @@ public: */ virtual void frame(); + /** + * Tue l'objet donné + */ + void kill(Object::Ptr object); + /** * Récupère si on est en mode test ou pas */ diff --git a/include/gravity_block.hpp b/include/gravity_block.hpp index 193dbfb..653d641 100644 --- a/include/gravity_block.hpp +++ b/include/gravity_block.hpp @@ -42,7 +42,7 @@ public: /** * Appelé lorsque le bloc de gravité est activé par un objet */ - virtual void activate(Game& game, Object* object); + virtual void activate(Game& game, Object::Ptr object); /** * Récupère l'identifiant de type des blocs de gravité diff --git a/include/kill_block.hpp b/include/kill_block.hpp index 7ffb8d3..d0efeb8 100644 --- a/include/kill_block.hpp +++ b/include/kill_block.hpp @@ -39,7 +39,7 @@ public: /** * Appelé lorsque le bloc tueur est activé par un objet */ - virtual void activate(Game& game, Object* object); + virtual void activate(Game& game, Object::Ptr object); /** * Récupère l'identifiant de type des blocs tueurs diff --git a/include/object.hpp b/include/object.hpp index 878b3f1..6c4ce89 100644 --- a/include/object.hpp +++ b/include/object.hpp @@ -11,9 +11,10 @@ class Level; class Game; -class Object { +class Object : public std::enable_shared_from_this { public: typedef std::shared_ptr Ptr; + typedef std::weak_ptr WeakPtr; private: sf::Vector2f acceleration; @@ -21,6 +22,10 @@ private: sf::Vector2f position; bool selected; + Object::WeakPtr last_activator; + + // propriétés internes, autorisées à être modifiées + // même par des méthodes constantes mutable float inv_mass; float mass; @@ -36,6 +41,11 @@ protected: */ virtual sf::Vector2f getForces(const Game& game) const; + /** + * Appelé lorsque l'objet est activé par un autre + */ + virtual void activate(Game& game, Object::Ptr object) = 0; + /** * Initialisation des propriétés communes à tous les objets * depuis le fichier donné dans l'objet donné @@ -76,11 +86,6 @@ public: */ virtual void draw(Level& level) = 0; - /** - * Appelé lorsque l'objet est activé par un autre - */ - virtual void activate(Game& game, Object* object) = 0; - /** * Appelé lorsque l'objet a été tué. Si cette fonction * est appelé, l'objet sera supprimé à la frame suivante @@ -174,6 +179,11 @@ public: */ void setSelected(bool set_selected); + /** + * Récupère le dernier object ayant activé cet objet + */ + Object::WeakPtr getLastActivator(); + /** * Récupère la masse de l'objet */ diff --git a/include/player.hpp b/include/player.hpp index fa41e90..62ed646 100644 --- a/include/player.hpp +++ b/include/player.hpp @@ -57,7 +57,7 @@ public: /** * Appelé lorsque le joueur est activé par un objet */ - virtual void activate(Game& game, Object* object); + virtual void activate(Game& game, Object::Ptr object); /** * Appelé lorsque le jouer a été tué. Si cette fonction diff --git a/include/switch_block.hpp b/include/switch_block.hpp index 6a35520..91d5115 100644 --- a/include/switch_block.hpp +++ b/include/switch_block.hpp @@ -39,7 +39,7 @@ public: /** * Appelé lorsque le bloc changeur est activé par un objet */ - virtual void activate(Game& game, Object* object); + virtual void activate(Game& game, Object::Ptr object); /** * Récupère l'identifiant de type des blocs changeurs diff --git a/src/block.cpp b/src/block.cpp index 763d9c6..9e2a267 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -75,7 +75,7 @@ void Block::draw(Level& level) { } } -void Block::activate(Game& game, Object* object) { +void Block::activate(Game& game, Object::Ptr object) { // ne rien faire si le bloc est activé. // Ceci est un bloc de base qui n'a pas a réagir // aux activations diff --git a/src/finish_block.cpp b/src/finish_block.cpp index 420ac91..743a86f 100644 --- a/src/finish_block.cpp +++ b/src/finish_block.cpp @@ -16,7 +16,7 @@ void FinishBlock::prepareDraw(ResourceManager& resources) { sprite.setTexture(resources.getTexture("finish_block.tga"), true); } -void FinishBlock::activate(Game& game, Object* object) { +void FinishBlock::activate(Game& game, Object::Ptr object) { Block::activate(game, object); // TODO: implémenter le comportmeent des blocs d'arrivée } diff --git a/src/game.cpp b/src/game.cpp index b6c091c..773f677 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -184,8 +184,7 @@ void Game::update() { // l'objet est sorti de la zone, on le signale et on // planifie sa mort à la prochaine frame if (!isInZone(obj_a) && obj_a->getMass() != 0) { - obj_a->kill(*this); - pending_kill.push_back(obj_a); + kill(obj_a); } // on regarde s'il est en collision avec @@ -224,6 +223,11 @@ void Game::update() { } } +void Game::kill(Object::Ptr object) { + object->kill(*this); + pending_kill.push_back(object); +} + /** * Implémentation tirée de * http://stackoverflow.com/a/2922778/3452708 diff --git a/src/gravity_block.cpp b/src/gravity_block.cpp index 5f7e790..a7a994c 100644 --- a/src/gravity_block.cpp +++ b/src/gravity_block.cpp @@ -35,7 +35,7 @@ void GravityBlock::prepareDraw(ResourceManager& resources) { sprite.setTexture(resources.getTexture(texture_name + ".tga")); } -void GravityBlock::activate(Game& game, Object* object) { +void GravityBlock::activate(Game& game, Object::Ptr object) { Block::activate(game, object); // lorsque le bloc est activé, il transmet son diff --git a/src/kill_block.cpp b/src/kill_block.cpp index 20b5282..aac692b 100644 --- a/src/kill_block.cpp +++ b/src/kill_block.cpp @@ -1,5 +1,6 @@ #include "kill_block.hpp" #include "game.hpp" +#include "player.hpp" const unsigned int KillBlock::TYPE_ID = 5; @@ -15,9 +16,13 @@ void KillBlock::prepareDraw(ResourceManager& resources) { sprite.setTexture(resources.getTexture("kill_block.tga")); } -void KillBlock::activate(Game& game, Object* object) { +void KillBlock::activate(Game& game, Object::Ptr object) { Block::activate(game, object); - // TODO: implémenter le comportmeent des blocs tueurs + + // si un joueur touche un bloc de mort, on le tue + if (object->getTypeId() == Player::TYPE_ID) { + game.kill(object); + } } unsigned int KillBlock::getTypeId() const { diff --git a/src/object.cpp b/src/object.cpp index e92fde7..d0c3c29 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -233,17 +233,20 @@ void Object::solveCollision(Game& game, Object::Ptr obj, const sf::Vector2f& nor sf::Vector2f rel_velo = obj->getVelocity() - getVelocity(); float dot_normal = rel_velo.x * normal.x + rel_velo.y * normal.y; + // en ce point, on est bertins qu'une collision a eu lieu. + // on peut donc activer les deux objets + activate(game, obj); + obj->activate(game, shared_from_this()); + + last_activator = obj; + obj->last_activator = shared_from_this(); + // si les directions sont divergentes, pas besoin // de résoudre la collision if (dot_normal > 0) { return; } - // en ce point, on est bertins qu'une collision a eu lieu. - // activation réciproque des deux objets - activate(game, obj.get()); - obj->activate(game, 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()); @@ -327,6 +330,10 @@ void Object::setSelected(bool set_selected) { selected = set_selected; } +Object::WeakPtr Object::getLastActivator() { + return last_activator; +} + float Object::getMass() const { return mass; } diff --git a/src/player.cpp b/src/player.cpp index d363060..849a9e2 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -90,7 +90,7 @@ void Player::draw(Level& level) { level.getWindow().draw(sprite); } -void Player::activate(Game& game, Object* object) { +void Player::activate(Game& game, Object::Ptr 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 diff --git a/src/switch_block.cpp b/src/switch_block.cpp index c410018..14b222c 100644 --- a/src/switch_block.cpp +++ b/src/switch_block.cpp @@ -15,9 +15,13 @@ void SwitchBlock::prepareDraw(ResourceManager& resources) { sprite.setTexture(resources.getTexture("switch_block.tga")); } -void SwitchBlock::activate(Game& game, Object* object) { +void SwitchBlock::activate(Game& game, Object::Ptr object) { Block::activate(game, object); - // TODO: implémenter le comportmeent des blocs changeurs + + // on échange la polarité de l'objet en contact + if (object->getLastActivator().lock().get() != this) { + object->setCharge(-object->getCharge()); + } } unsigned int SwitchBlock::getTypeId() const {