Implémentation des comportements des blocs tueurs et changeurs

This commit is contained in:
Mattéo Delabre 2016-04-11 16:32:19 +02:00
parent 10a9bc2014
commit a7cd6235e7
16 changed files with 62 additions and 27 deletions

View File

@ -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 é tué. Si cette fonction

View File

@ -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

View File

@ -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
*/

View File

@ -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é

View File

@ -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

View File

@ -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 é 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
*/

View File

@ -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 é tué. Si cette fonction

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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;
}

View File

@ -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

View File

@ -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 {