diff --git a/include/block.hpp b/include/block.hpp index d8c2394..5d3eb02 100644 --- a/include/block.hpp +++ b/include/block.hpp @@ -5,6 +5,9 @@ #include #include "object.hpp" +class Game; +class Level; + class Block : public Object { public: typedef std::shared_ptr Ptr; @@ -59,7 +62,7 @@ public: /** * Appelé lorsque le bloc est activé par un objet */ - virtual void activate(Level& level, Object* object); + virtual void activate(Game& game, Object* object); /** * Appelé lorsque le bloc a été tué. Si cette fonction diff --git a/include/finish_block.hpp b/include/finish_block.hpp index 8365813..dd053a4 100644 --- a/include/finish_block.hpp +++ b/include/finish_block.hpp @@ -4,7 +4,7 @@ #include #include #include "block.hpp" -#include "level.hpp" +#include "game.hpp" class FinishBlock : public Block { public: @@ -39,7 +39,7 @@ public: /** * Appelé lorsque le bloc d'arrivée est activé par un objet */ - virtual void activate(Level& level, Object* object); + virtual void activate(Game& game, Object* object); /** * Récupère l'identifiant de type des blocs d'arrivée diff --git a/include/game.hpp b/include/game.hpp index 4651dcf..62ca548 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -15,6 +15,11 @@ public: */ enum class Mode {NORMAL, PAUSED, WON, LOST}; + /** + * Les différentes raisons de mort + */ + enum class DeathCause {NONE, OUT_OF_BOUNDS, KILLED, TIME_OUT}; + private: WidgetTimer widget_timer; sf::Time next_frame_time; @@ -25,6 +30,7 @@ private: std::shared_ptr return_state; Mode mode; + DeathCause death_cause; /** * Met à jour les objets du jeu pour @@ -84,11 +90,13 @@ public: * Récupère le mode actuel de jeu */ Mode getMode(); + DeathCause getDeathCause(); /** * Modifie le mode actuel de jeu */ void setMode(Mode set_mode); + void setDeathCause(DeathCause set_death_cause); }; #endif diff --git a/include/gravity_block.hpp b/include/gravity_block.hpp index f27d131..193dbfb 100644 --- a/include/gravity_block.hpp +++ b/include/gravity_block.hpp @@ -4,7 +4,7 @@ #include #include #include "block.hpp" -#include "level.hpp" +#include "game.hpp" class GravityBlock : public Block { public: @@ -42,7 +42,7 @@ public: /** * Appelé lorsque le bloc de gravité est activé par un objet */ - virtual void activate(Level& level, Object* object); + virtual void activate(Game& game, Object* 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 eb5f6c9..7ffb8d3 100644 --- a/include/kill_block.hpp +++ b/include/kill_block.hpp @@ -4,7 +4,7 @@ #include #include #include "block.hpp" -#include "level.hpp" +#include "game.hpp" class KillBlock : public Block { public: @@ -39,7 +39,7 @@ public: /** * Appelé lorsque le bloc tueur est activé par un objet */ - virtual void activate(Level& level, Object* object); + virtual void activate(Game& game, Object* object); /** * Récupère l'identifiant de type des blocs tueurs diff --git a/include/object.hpp b/include/object.hpp index 07b5a25..878b3f1 100644 --- a/include/object.hpp +++ b/include/object.hpp @@ -34,7 +34,7 @@ protected: /** * Calcule les forces appliquées à l'objet */ - virtual sf::Vector2f getForces(const Level& level) const; + virtual sf::Vector2f getForces(const Game& game) const; /** * Initialisation des propriétés communes à tous les objets @@ -79,7 +79,7 @@ public: /** * Appelé lorsque l'objet est activé par un autre */ - virtual void activate(Level& level, Object* object) = 0; + virtual void activate(Game& game, Object* object) = 0; /** * Appelé lorsque l'objet a été tué. Si cette fonction @@ -106,7 +106,7 @@ public: * Met à jour la vitesse de l'objet selon les * forces qui lui sont appliquées */ - virtual void updateVelocity(const Level& level); + virtual void updateVelocity(const Game& game); /** * Met à jour la position de l'objet selon sa @@ -125,7 +125,7 @@ public: * et l'objet passé en paramètre selon la normale * donnée */ - virtual void solveCollision(Level& level, Object::Ptr obj, const sf::Vector2f& normal); + virtual void solveCollision(Game& game, Object::Ptr obj, const sf::Vector2f& normal); /** * Application de la correction positionnelle sur diff --git a/include/player.hpp b/include/player.hpp index f9e192d..fa41e90 100644 --- a/include/player.hpp +++ b/include/player.hpp @@ -17,7 +17,7 @@ protected: /** * Calcule les forces appliquées au joueur */ - virtual sf::Vector2f getForces(const Level& level) const; + virtual sf::Vector2f getForces(const Game& game) const; /** * Initialisation des propriétés du joueur donné @@ -57,7 +57,7 @@ public: /** * Appelé lorsque le joueur est activé par un objet */ - virtual void activate(Level& level, Object* object); + virtual void activate(Game& game, Object* object); /** * Appelé lorsque le jouer a été tué. Si cette fonction diff --git a/include/switch_block.hpp b/include/switch_block.hpp index 1288296..6a35520 100644 --- a/include/switch_block.hpp +++ b/include/switch_block.hpp @@ -4,7 +4,7 @@ #include #include #include "block.hpp" -#include "level.hpp" +#include "game.hpp" class SwitchBlock : public Block { public: @@ -39,7 +39,7 @@ public: /** * Appelé lorsque le bloc changeur est activé par un objet */ - virtual void activate(Level& level, Object* object); + virtual void activate(Game& game, Object* object); /** * Récupère l'identifiant de type des blocs changeurs diff --git a/src/block.cpp b/src/block.cpp index 3f63f75..763d9c6 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -1,5 +1,6 @@ #include "block.hpp" #include "level.hpp" +#include "game.hpp" #include "player.hpp" #include "constants.hpp" #include "resource_manager.hpp" @@ -74,7 +75,7 @@ void Block::draw(Level& level) { } } -void Block::activate(Level& level, Object* object) { +void Block::activate(Game& game, Object* 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 c50e0f6..420ac91 100644 --- a/src/finish_block.cpp +++ b/src/finish_block.cpp @@ -1,5 +1,5 @@ #include "finish_block.hpp" -#include "level.hpp" +#include "game.hpp" const unsigned int FinishBlock::TYPE_ID = 4; @@ -16,8 +16,8 @@ void FinishBlock::prepareDraw(ResourceManager& resources) { sprite.setTexture(resources.getTexture("finish_block.tga"), true); } -void FinishBlock::activate(Level& level, Object* object) { - Block::activate(level, object); +void FinishBlock::activate(Game& game, Object* 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 8d81552..b6c091c 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -21,6 +21,8 @@ void Game::begin() { } mode = Game::Mode::NORMAL; + death_cause = Game::DeathCause::NONE; + time_left = getTotalTime(); getWindow().setFramerateLimit(0); } @@ -65,6 +67,39 @@ void Game::frame() { // si on est en mode normal if (getMode() == Game::Mode::NORMAL) { update(); + } else { + // TODO: pour le débogage affichage du mode actuel + switch (getMode()) { + case Game::Mode::NORMAL: + std::cout << "<< Reprise >>" << std::endl; + break; + case Game::Mode::PAUSED: + std::cout << "<< En pause >>" << std::endl; + break; + case Game::Mode::WON: + std::cout << "<< Gagné ! >>" << std::endl; + break; + case Game::Mode::LOST: + std::cout << "<< Perdu : "; + + switch (getDeathCause()) { + case Game::DeathCause::NONE: + std::cout << "sans aucune raison"; + break; + case Game::DeathCause::OUT_OF_BOUNDS: + std::cout << "sortie du cadre"; + break; + case Game::DeathCause::KILLED: + std::cout << "tué par bloc"; + break; + case Game::DeathCause::TIME_OUT: + std::cout << "temps écoulé"; + break; + } + + std::cout << " !" << std::endl; + break; + } } // on s'assure que la caméra soit centrée sur nos joueurs @@ -129,6 +164,7 @@ void Game::update() { // on a perdu if (time_left <= 0) { setMode(Game::Mode::LOST); + setDeathCause(Game::DeathCause::TIME_OUT); return; } else { time_left -= Manager::FRAME_TIME.asSeconds(); @@ -222,23 +258,14 @@ Game::Mode Game::getMode() { return mode; } +Game::DeathCause Game::getDeathCause() { + return death_cause; +} + void Game::setMode(Game::Mode set_mode) { mode = set_mode; - - // TODO: pour le débogage - // affichage du mode actuel - switch (set_mode) { - case Game::Mode::NORMAL: - std::cout << "<< Reprise >>" << std::endl; - break; - case Game::Mode::PAUSED: - std::cout << "<< En pause >>" << std::endl; - break; - case Game::Mode::WON: - std::cout << "<< Gagné ! >>" << std::endl; - break; - case Game::Mode::LOST: - std::cout << "<< Perdu ! >>" << std::endl; - break; - } +} + +void Game::setDeathCause(Game::DeathCause set_death_cause) { + death_cause = set_death_cause; } diff --git a/src/gravity_block.cpp b/src/gravity_block.cpp index d73abbb..5f7e790 100644 --- a/src/gravity_block.cpp +++ b/src/gravity_block.cpp @@ -1,5 +1,5 @@ #include "gravity_block.hpp" -#include "level.hpp" +#include "game.hpp" const unsigned int GravityBlock::TYPE_ID = 3; @@ -35,12 +35,12 @@ void GravityBlock::prepareDraw(ResourceManager& resources) { sprite.setTexture(resources.getTexture(texture_name + ".tga")); } -void GravityBlock::activate(Level& level, Object* object) { - Block::activate(level, object); +void GravityBlock::activate(Game& game, Object* object) { + Block::activate(game, object); // lorsque le bloc est activé, il transmet son // sens de gravité au niveau - level.setGravityDirection(gravity_direction); + game.setGravityDirection(gravity_direction); } unsigned int GravityBlock::getTypeId() const { diff --git a/src/kill_block.cpp b/src/kill_block.cpp index 56a527f..20b5282 100644 --- a/src/kill_block.cpp +++ b/src/kill_block.cpp @@ -1,5 +1,5 @@ #include "kill_block.hpp" -#include "level.hpp" +#include "game.hpp" const unsigned int KillBlock::TYPE_ID = 5; @@ -15,8 +15,8 @@ void KillBlock::prepareDraw(ResourceManager& resources) { sprite.setTexture(resources.getTexture("kill_block.tga")); } -void KillBlock::activate(Level& level, Object* object) { - Block::activate(level, object); +void KillBlock::activate(Game& game, Object* object) { + Block::activate(game, object); // TODO: implémenter le comportmeent des blocs tueurs } diff --git a/src/object.cpp b/src/object.cpp index 12e7b5c..e92fde7 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1,5 +1,5 @@ #include "object.hpp" -#include "level.hpp" +#include "game.hpp" #include "constants.hpp" #include "collision.hpp" #include @@ -145,12 +145,12 @@ void Object::save(std::ofstream& file) const { file.write(&null_byte, 1); } -sf::Vector2f Object::getForces(const Level& level) const { +sf::Vector2f Object::getForces(const Game& game) const { sf::Vector2f forces(0, 0); - const std::vector& objects = level.getObjects(); + const std::vector& objects = game.getObjects(); // force de gravité - forces += getMass() * level.getGravity(); + forces += getMass() * game.getGravity(); // force d'attraction entre objets chargés if (getCharge() != 0) { @@ -188,8 +188,8 @@ sf::Vector2f Object::getForces(const Level& level) const { return forces; } -void Object::updateVelocity(const Level& level) { - acceleration = getForces(level) * getMassInvert(); +void Object::updateVelocity(const Game& game) { + acceleration = getForces(game) * getMassInvert(); velocity += acceleration * Manager::FRAME_TIME.asSeconds(); } @@ -221,7 +221,7 @@ bool Object::detectCollision(Object::Ptr obj, CollisionData& data) const { return getCollisionData(data); } -void Object::solveCollision(Level& level, Object::Ptr obj, const sf::Vector2f& normal) { +void Object::solveCollision(Game& game, Object::Ptr obj, const sf::Vector2f& normal) { // si les deux objets sont de masse infinie, réinitialisation // des vitesses en tant que collision if (getMassInvert() == 0 && obj->getMassInvert() == 0) { @@ -241,8 +241,8 @@ void Object::solveCollision(Level& level, Object::Ptr obj, const sf::Vector2f& n // en ce point, on est bertins qu'une collision a eu lieu. // activation réciproque des deux objets - activate(level, obj.get()); - obj->activate(level, this); + 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 diff --git a/src/player.cpp b/src/player.cpp index 6052d4d..d363060 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -1,6 +1,6 @@ #include "player.hpp" #include "game.hpp" -#include "level.hpp" +#include "game.hpp" #include "block.hpp" #include "constants.hpp" #include @@ -36,27 +36,27 @@ void Player::save(std::ofstream& file) const { Object::save(file); } -sf::Vector2f Player::getForces(const Level& level) const { - sf::Vector2f forces = Object::getForces(level); +sf::Vector2f Player::getForces(const Game& game) const { + sf::Vector2f forces = Object::getForces(game); // déplacement de la balle après appui sur les touches de direction if (getPlayerNumber() == 0) { - if (level.getManager().isKeyPressed(sf::Keyboard::Left)) { - forces += level.getLeftDirection(); + if (game.getManager().isKeyPressed(sf::Keyboard::Left)) { + forces += game.getLeftDirection(); } - if (level.getManager().isKeyPressed(sf::Keyboard::Right)) { - forces += level.getRightDirection(); + if (game.getManager().isKeyPressed(sf::Keyboard::Right)) { + forces += game.getRightDirection(); } } if (getPlayerNumber() == 1) { - if (level.getManager().isKeyPressed(sf::Keyboard::Q)) { - forces += level.getLeftDirection(); + if (game.getManager().isKeyPressed(sf::Keyboard::Q)) { + forces += game.getLeftDirection(); } - if (level.getManager().isKeyPressed(sf::Keyboard::D)) { - forces += level.getRightDirection(); + if (game.getManager().isKeyPressed(sf::Keyboard::D)) { + forces += game.getRightDirection(); } } @@ -90,7 +90,7 @@ void Player::draw(Level& level) { level.getWindow().draw(sprite); } -void Player::activate(Level& level, Object* object) { +void Player::activate(Game& game, Object* 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 8daf66a..c410018 100644 --- a/src/switch_block.cpp +++ b/src/switch_block.cpp @@ -1,5 +1,5 @@ #include "switch_block.hpp" -#include "level.hpp" +#include "game.hpp" const unsigned int SwitchBlock::TYPE_ID = 6; @@ -15,8 +15,8 @@ void SwitchBlock::prepareDraw(ResourceManager& resources) { sprite.setTexture(resources.getTexture("switch_block.tga")); } -void SwitchBlock::activate(Level& level, Object* object) { - Block::activate(level, object); +void SwitchBlock::activate(Game& game, Object* object) { + Block::activate(game, object); // TODO: implémenter le comportmeent des blocs changeurs }