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