diff --git a/include/editor.hpp b/include/editor.hpp index 67c6152..a3138a4 100644 --- a/include/editor.hpp +++ b/include/editor.hpp @@ -94,6 +94,11 @@ public: Editor(Manager& manager); virtual ~Editor(); + /** + * Active l'état + */ + virtual void enable(); + /** * Traite l'événement donné */ diff --git a/include/game.hpp b/include/game.hpp index 4640154..7f59e95 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -60,6 +60,11 @@ public: Game(Manager& manager); virtual ~Game(); + /** + * Active l'état + */ + virtual void enable(); + /** * Traite l'événement donné */ diff --git a/include/level.hpp b/include/level.hpp index c0b50c9..fbc1d3b 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -58,6 +58,11 @@ public: Level(Manager& manager); virtual ~Level(); + /** + * Active l'état + */ + virtual void enable(); + /** * Obtient le nom du niveau dont le chemin complet * et absolu est en paramètre diff --git a/include/manager.hpp b/include/manager.hpp index b6c4015..749d20a 100644 --- a/include/manager.hpp +++ b/include/manager.hpp @@ -21,6 +21,7 @@ private: sf::View gui_view; sf::String title; + State* previous_state; std::stack> states; public: diff --git a/include/menu.hpp b/include/menu.hpp index 572194b..b75b809 100644 --- a/include/menu.hpp +++ b/include/menu.hpp @@ -64,6 +64,11 @@ public: Menu(Manager& manager); virtual ~Menu(); + /** + * Active l'état + */ + virtual void enable(); + /** * Traite l'événement donné */ diff --git a/include/rules.hpp b/include/rules.hpp index a918903..dfb5ba5 100644 --- a/include/rules.hpp +++ b/include/rules.hpp @@ -16,6 +16,11 @@ public: Rules(Manager& manager); virtual ~Rules(); + /** + * Active l'état + */ + virtual void enable(); + /** * Traite l'événement donné */ diff --git a/include/state.hpp b/include/state.hpp index cd6ca03..debf787 100644 --- a/include/state.hpp +++ b/include/state.hpp @@ -17,6 +17,11 @@ public: State(Manager& manager); virtual ~State(); + /** + * Active l'état + */ + virtual void enable() = 0; + /** * Traite l'événement donné */ diff --git a/src/editor.cpp b/src/editor.cpp index 8572d2c..d9f628c 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -38,6 +38,17 @@ Editor::Editor(Manager& manager) : Level(manager), Editor::~Editor() {} +void Editor::enable() { + Level::enable(); + + // attributs de la fenêtre + getManager().setTitle(sf::String(L"Édition de ") + getName()); + getManager().setFramerate(Manager::FPS); + + // joue la musique de l'éditeur + getResourceManager().playMusic("editor.ogg"); +} + void Editor::processEvent(const sf::Event& event) { Level::processEvent(event); @@ -240,13 +251,6 @@ void Editor::processEvent(const sf::Event& event) { } void Editor::frame() { - // attributs de la fenêtre - getManager().setTitle(sf::String(L"Édition de ") + getName()); - getManager().setFramerate(Manager::FPS); - - // joue la musique de l'éditeur - getResourceManager().playMusic("editor.ogg"); - // dessin de la frame draw(); } diff --git a/src/game.cpp b/src/game.cpp index 0101beb..b69e6bb 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -23,6 +23,21 @@ Game::Game(Manager& manager) : Level(manager), Game::~Game() {} +void Game::enable() { + Level::enable(); + + // attributs de la fenêtre + getManager().setTitle(getName()); + getManager().setFramerate(0); + + // si musique il y a, on la joue + if (getMusic() != "") { + getResourceManager().playMusic(getMusic()); + } else { + getResourceManager().stopMusic(); + } +} + void Game::processEvent(const sf::Event& event) { Level::processEvent(event); @@ -45,17 +60,6 @@ void Game::processEvent(const sf::Event& event) { } void Game::frame() { - // attributs de la fenêtre - getManager().setTitle(getName()); - getManager().setFramerate(0); - - // si musique il y a, on la joue - if (getMusic() != "") { - getResourceManager().playMusic(getMusic()); - } else { - getResourceManager().stopMusic(); - } - sf::Time current_time = getManager().getCurrentTime(); if (current_time >= next_frame_time) { diff --git a/src/level.cpp b/src/level.cpp index f3bf782..cd0e94a 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -152,14 +152,8 @@ namespace { } Level::Level(Manager& manager) : State(manager) { - sf::Vector2u window_size = getWindow().getSize(); gravity_direction = GravityDirection::SOUTH; - // positionnement par défaut de la caméra - camera.setSize(window_size.x, window_size.y); - camera.setCenter(0, 0); - camera_angle = 180.f; - // métadonnées par défaut setName(sf::String("Nouveau niveau")); current_path = getResourceManager().getLevelPath("new_level.dat"); @@ -178,6 +172,15 @@ Level::Level(Manager& manager) : State(manager) { Level::~Level() {} +void Level::enable() { + // positionnement par défaut de la caméra + sf::Vector2u window_size = getWindow().getSize(); + + camera.setSize(window_size.x, window_size.y); + camera.setCenter(0, 0); + camera_angle = 180.f; +} + sf::String Level::getLevelName(std::string path) { sf::String name; int total_time; diff --git a/src/main.cpp b/src/main.cpp index 9ea798f..4e54a3d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,10 +6,14 @@ #include int main() { + // le gestionnaire du jeu gère la pile d'états Manager manager; + + // on crée une instance de l'état "menu" auto menu = std::unique_ptr(new Menu(manager)); try { + // on empile l'état du menu et on démarre manager.pushState(std::move(menu)); manager.start(); } catch (const std::exception& exception) { diff --git a/src/manager.cpp b/src/manager.cpp index 972a3db..73d12c5 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -5,7 +5,7 @@ const unsigned int Manager::FPS = 60; const sf::Time Manager::FRAME_TIME = sf::seconds(1.f / Manager::FPS); const float Manager::GRID = 32; -Manager::Manager() : title(sf::String(L"")) { +Manager::Manager() : title(sf::String(L"")), previous_state(nullptr) { // préchargement des textures resource_manager.preload(); @@ -53,7 +53,16 @@ void Manager::start() { return; } - // affichage de la prochaine frame + // si l'état que l'on va utiliser n'est pas le + // même que précédemment, on l'active + // Ceci permet un partage plus facile des + // ressources globales (vue, musique) + if (previous_state != states.top().get()) { + previous_state = states.top().get(); + previous_state->enable(); + } + + // demande à l'état actuel d'afficher une frame states.top()->frame(); window.display(); } diff --git a/src/menu.cpp b/src/menu.cpp index 6ecb670..aeb5d87 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -12,6 +12,15 @@ Menu::Menu(Manager& manager) : State(manager) { Menu::~Menu() {} +void Menu::enable() { + // attributs de la fenêtre + getManager().setTitle(""); + getManager().setFramerate(Manager::FPS); + + // joue la musique du menu + getResourceManager().playMusic("menu.ogg"); +} + void Menu::processEvent(const sf::Event& event) { // gestion des touches if (event.type == sf::Event::KeyPressed) { @@ -71,13 +80,6 @@ void Menu::processEvent(const sf::Event& event) { } void Menu::frame() { - // attributsde la fenêtre - getManager().setTitle(""); - getManager().setFramerate(Manager::FPS); - - // joue la musique du menu - getResourceManager().playMusic("menu.ogg"); - // affichage du menu sf::RenderWindow& window = getWindow(); sf::Vector2f size = (sf::Vector2f) window.getSize(); diff --git a/src/rules.cpp b/src/rules.cpp index 8e3add6..6aee4cf 100644 --- a/src/rules.cpp +++ b/src/rules.cpp @@ -8,6 +8,15 @@ Rules::Rules(Manager& manager) : State(manager) { Rules::~Rules() {} +void Rules::enable() { + // attributs de la fenêtre + getManager().setTitle(L"Règles"); + getManager().setFramerate(Manager::FPS); + + // joue la musique du menu + getResourceManager().playMusic("menu.ogg"); +} + void Rules::processEvent(const sf::Event& event) { // appui sur échap, retour, entrée, espace : on dépile l'état if (event.type == sf::Event::KeyPressed) { @@ -24,13 +33,6 @@ void Rules::frame() { sf::RenderWindow& window = getWindow(); sf::Vector2f size = (sf::Vector2f) window.getSize(); - // attributs de la fenêtre - getManager().setTitle(L"Règles"); - getManager().setFramerate(Manager::FPS); - - // joue la musique du menu - getResourceManager().playMusic("menu.ogg"); - // on s'assure d'être dans la vue par défaut (pas de zoom, 0x0 en haut gauche) getManager().useGUIView();