Implémentation des comportements des blocs tueurs et changeurs
This commit is contained in:
		
							parent
							
								
									10a9bc2014
								
							
						
					
					
						commit
						a7cd6235e7
					
				|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|      */ | ||||
|  |  | |||
|  | @ -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é | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -11,9 +11,10 @@ | |||
| class Level; | ||||
| class Game; | ||||
| 
 | ||||
| class Object { | ||||
| class Object : public std::enable_shared_from_this<Object> { | ||||
| public: | ||||
|     typedef std::shared_ptr<Object> Ptr; | ||||
|     typedef std::weak_ptr<Object> 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 | ||||
|      */ | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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
 | ||||
| } | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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 { | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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 { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue