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
|
* 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
|
* 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
|
* 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
|
* Récupère l'identifiant de type des blocs d'arrivée
|
||||||
|
|
|
@ -75,6 +75,11 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void frame();
|
virtual void frame();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tue l'objet donné
|
||||||
|
*/
|
||||||
|
void kill(Object::Ptr object);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère si on est en mode test ou pas
|
* 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
|
* 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é
|
* 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
|
* 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
|
* Récupère l'identifiant de type des blocs tueurs
|
||||||
|
|
|
@ -11,9 +11,10 @@
|
||||||
class Level;
|
class Level;
|
||||||
class Game;
|
class Game;
|
||||||
|
|
||||||
class Object {
|
class Object : public std::enable_shared_from_this<Object> {
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<Object> Ptr;
|
typedef std::shared_ptr<Object> Ptr;
|
||||||
|
typedef std::weak_ptr<Object> WeakPtr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
sf::Vector2f acceleration;
|
sf::Vector2f acceleration;
|
||||||
|
@ -21,6 +22,10 @@ private:
|
||||||
sf::Vector2f position;
|
sf::Vector2f position;
|
||||||
|
|
||||||
bool selected;
|
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;
|
mutable float inv_mass;
|
||||||
|
|
||||||
float mass;
|
float mass;
|
||||||
|
@ -36,6 +41,11 @@ protected:
|
||||||
*/
|
*/
|
||||||
virtual sf::Vector2f getForces(const Game& game) const;
|
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
|
* Initialisation des propriétés communes à tous les objets
|
||||||
* depuis le fichier donné dans l'objet donné
|
* depuis le fichier donné dans l'objet donné
|
||||||
|
@ -76,11 +86,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void draw(Level& level) = 0;
|
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
|
* Appelé lorsque l'objet a été tué. Si cette fonction
|
||||||
* est appelé, l'objet sera supprimé à la frame suivante
|
* est appelé, l'objet sera supprimé à la frame suivante
|
||||||
|
@ -174,6 +179,11 @@ public:
|
||||||
*/
|
*/
|
||||||
void setSelected(bool set_selected);
|
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
|
* Récupère la masse de l'objet
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -57,7 +57,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Appelé lorsque le joueur est activé par un objet
|
* 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
|
* 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
|
* 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
|
* 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é.
|
// ne rien faire si le bloc est activé.
|
||||||
// Ceci est un bloc de base qui n'a pas a réagir
|
// Ceci est un bloc de base qui n'a pas a réagir
|
||||||
// aux activations
|
// aux activations
|
||||||
|
|
|
@ -16,7 +16,7 @@ void FinishBlock::prepareDraw(ResourceManager& resources) {
|
||||||
sprite.setTexture(resources.getTexture("finish_block.tga"), true);
|
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);
|
Block::activate(game, object);
|
||||||
// TODO: implémenter le comportmeent des blocs d'arrivée
|
// 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
|
// l'objet est sorti de la zone, on le signale et on
|
||||||
// planifie sa mort à la prochaine frame
|
// planifie sa mort à la prochaine frame
|
||||||
if (!isInZone(obj_a) && obj_a->getMass() != 0) {
|
if (!isInZone(obj_a) && obj_a->getMass() != 0) {
|
||||||
obj_a->kill(*this);
|
kill(obj_a);
|
||||||
pending_kill.push_back(obj_a);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// on regarde s'il est en collision avec
|
// 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
|
* Implémentation tirée de
|
||||||
* http://stackoverflow.com/a/2922778/3452708
|
* http://stackoverflow.com/a/2922778/3452708
|
||||||
|
|
|
@ -35,7 +35,7 @@ void GravityBlock::prepareDraw(ResourceManager& resources) {
|
||||||
sprite.setTexture(resources.getTexture(texture_name + ".tga"));
|
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);
|
Block::activate(game, object);
|
||||||
|
|
||||||
// lorsque le bloc est activé, il transmet son
|
// lorsque le bloc est activé, il transmet son
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "kill_block.hpp"
|
#include "kill_block.hpp"
|
||||||
#include "game.hpp"
|
#include "game.hpp"
|
||||||
|
#include "player.hpp"
|
||||||
|
|
||||||
const unsigned int KillBlock::TYPE_ID = 5;
|
const unsigned int KillBlock::TYPE_ID = 5;
|
||||||
|
|
||||||
|
@ -15,9 +16,13 @@ void KillBlock::prepareDraw(ResourceManager& resources) {
|
||||||
sprite.setTexture(resources.getTexture("kill_block.tga"));
|
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);
|
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 {
|
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();
|
sf::Vector2f rel_velo = obj->getVelocity() - getVelocity();
|
||||||
float dot_normal = rel_velo.x * normal.x + rel_velo.y * normal.y;
|
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
|
// si les directions sont divergentes, pas besoin
|
||||||
// de résoudre la collision
|
// de résoudre la collision
|
||||||
if (dot_normal > 0) {
|
if (dot_normal > 0) {
|
||||||
return;
|
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
|
// on utilise le plus petit coefficient de friction entre les
|
||||||
// deux objets comme le coefficient de la collision
|
// deux objets comme le coefficient de la collision
|
||||||
float restitution = std::min(getRestitution(), obj->getRestitution());
|
float restitution = std::min(getRestitution(), obj->getRestitution());
|
||||||
|
@ -327,6 +330,10 @@ void Object::setSelected(bool set_selected) {
|
||||||
selected = set_selected;
|
selected = set_selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object::WeakPtr Object::getLastActivator() {
|
||||||
|
return last_activator;
|
||||||
|
}
|
||||||
|
|
||||||
float Object::getMass() const {
|
float Object::getMass() const {
|
||||||
return mass;
|
return mass;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,7 +90,7 @@ void Player::draw(Level& level) {
|
||||||
level.getWindow().draw(sprite);
|
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é.
|
// ne rien faire si le joueur est activé.
|
||||||
// en règle générale, c'est l'objet activé par le joueur
|
// en règle générale, c'est l'objet activé par le joueur
|
||||||
// qui s'occupe de la réponse
|
// qui s'occupe de la réponse
|
||||||
|
|
|
@ -15,9 +15,13 @@ void SwitchBlock::prepareDraw(ResourceManager& resources) {
|
||||||
sprite.setTexture(resources.getTexture("switch_block.tga"));
|
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);
|
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 {
|
unsigned int SwitchBlock::getTypeId() const {
|
||||||
|
|
Loading…
Reference in New Issue