diff --git a/include/editor.hpp b/include/editor.hpp index 7e19f09..f761feb 100644 --- a/include/editor.hpp +++ b/include/editor.hpp @@ -74,25 +74,24 @@ protected: */ virtual void draw(); - /** - * Traite un événement - */ - virtual void processEvent(const sf::Event& event); - public: Editor(Manager& manager); virtual ~Editor(); /** - * Appelé par le manager lorsque l'état commence à - * être utilisée + * Appelé par le manager lorsque l'état est utilisé */ virtual void begin(); /** - * Demande le passage à la frame suivante sur cet état + * Traite l'événement donné */ - virtual void frame(const std::vector& events); + virtual void processEvent(const sf::Event& event); + + /** + * Demande le dessin d'une frame + */ + virtual void frame(); }; #endif diff --git a/include/game.hpp b/include/game.hpp index a1cf32e..1837378 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -28,11 +28,6 @@ protected: */ virtual void draw(); - /** - * Traite un événement - */ - virtual void processEvent(const sf::Event& event); - /** * S'assure que la caméra est centrée sur les joueurs */ @@ -43,14 +38,19 @@ public: virtual ~Game(); /** - * Appelé par le manager lorsque le jeu commence + * Appelé par le manager lorsque l'état est utilisé */ virtual void begin(); /** - * Demande le passage à la frame suivante du jeu + * Traite l'événement donné */ - virtual void frame(const std::vector& events); + virtual void processEvent(const sf::Event& event); + + /** + * Demande le dessin d'une frame + */ + virtual void frame(); /** * Mise en mode test : l'appui sur espace renvoie diff --git a/include/level.hpp b/include/level.hpp index 18e8179..cb9ef16 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -37,11 +37,6 @@ protected: */ virtual void draw(); - /** - * Traite un événement - */ - virtual void processEvent(const sf::Event& event); - /** * Convertit les coordonnées à l'écran en coordonnées du monde * d'après la vue caméra @@ -69,14 +64,14 @@ public: virtual void save(std::string name); /** - * Appelé par le manager lorsque l'état commence à être utilisé + * Appelé par le manager lorsque l'état est utilisé */ virtual void begin(); /** - * Demande le passage à la frame suivante sur cet état + * Traite l'événement donné */ - virtual void frame(const std::vector& events); + virtual void processEvent(const sf::Event& event); /** * Récupère le nom du niveau diff --git a/include/menu.hpp b/include/menu.hpp index 0417fc3..9970aee 100644 --- a/include/menu.hpp +++ b/include/menu.hpp @@ -21,11 +21,6 @@ private: unsigned int selection; protected: - /** - * Traite l'événement donné - */ - virtual void processEvent(const sf::Event& event); - /** * Affiche les règles du jeu */ @@ -51,14 +46,19 @@ public: virtual ~Menu(); /** - * Appelé par le manager lorsque le menu est affiché + * Appelé par le manager lorsque l'état est utilisé */ virtual void begin(); /** - * Dessine la prochaine frame du menu + * Traite l'événement donné */ - virtual void frame(const std::vector& events); + virtual void processEvent(const sf::Event& event); + + /** + * Demande le dessin d'une frame + */ + virtual void frame(); /** * Affiche le menu principal diff --git a/include/state.hpp b/include/state.hpp index bb7bf13..401517e 100644 --- a/include/state.hpp +++ b/include/state.hpp @@ -14,26 +14,24 @@ class State { private: Manager& manager; -protected: - /** - * Traite l'événement donné - */ - virtual void processEvent(const sf::Event& event) = 0; - public: State(Manager& manager); virtual ~State(); /** - * Appelé par le manager lorsque l'état commence à - * être utilisé + * Appelé par le manager lorsque l'état est utilisé */ virtual void begin() = 0; /** - * Demande le passage à la frame suivante sur cet état + * Traite l'événement donné */ - virtual void frame(const std::vector& events); + virtual void processEvent(const sf::Event& event) = 0; + + /** + * Demande le dessin d'une frame + */ + virtual void frame() = 0; /** * Récupère le gestionnaire diff --git a/src/editor.cpp b/src/editor.cpp index 1821367..7d54f04 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -39,17 +39,6 @@ void Editor::begin() { getWindow().setFramerateLimit(60); } -void Editor::frame(const std::vector& events) { - // traitement des événements - Level::frame(events); - - // titre de la fenêtre - getManager().setTitle(sf::String(L"Édition de ") + getName()); - - // dessin de la frame - draw(); -} - void Editor::processEvent(const sf::Event& event) { Level::processEvent(event); @@ -173,6 +162,14 @@ void Editor::processEvent(const sf::Event& event) { } } +void Editor::frame() { + // titre de la fenêtre + getManager().setTitle(sf::String(L"Édition de ") + getName()); + + // dessin de la frame + draw(); +} + void Editor::draw() { sf::RenderWindow& window = getWindow(); sf::Vector2i window_size = (sf::Vector2i) window.getSize(); diff --git a/src/game.cpp b/src/game.cpp index 3f8a5d5..f84421a 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -17,10 +17,17 @@ void Game::begin() { getWindow().setFramerateLimit(0); } -void Game::frame(const std::vector& events) { - // traitement des événements - Level::frame(events); +void Game::processEvent(const sf::Event& event) { + Level::processEvent(event); + // appui sur espace en mode test : retour à l'éditeur + if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space && test_mode) { + test_mode = false; + getManager().setState(return_state); + } +} + +void Game::frame() { // titre de la fenêtre getManager().setTitle(getName()); sf::Time current_time = getManager().getCurrentTime(); @@ -47,16 +54,6 @@ void Game::frame(const std::vector& events) { } } -void Game::processEvent(const sf::Event& event) { - Level::processEvent(event); - - // appui sur espace en mode test : retour à l'éditeur - if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space && test_mode) { - test_mode = false; - getManager().setState(return_state); - } -} - void Game::draw() { sf::Vector2i window_size = (sf::Vector2i) getWindow().getSize(); diff --git a/src/level.cpp b/src/level.cpp index 18aa0f4..104034a 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -138,11 +138,6 @@ void Level::begin() { } } -void Level::frame(const std::vector& events) { - // traitement des événements - State::frame(events); -} - void Level::processEvent(const sf::Event& event) { // lorsque la fenêtre est redimensionnée, mise à jour // de la taille de la caméra diff --git a/src/manager.cpp b/src/manager.cpp index 108ef4b..3cc65d3 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -19,6 +19,11 @@ void Manager::start() { next_state = nullptr; } + // vérification de sécurité + if (state == NULL) { + throw std::runtime_error("Aucun état à afficher pour le jeu"); + } + // traitement des évènements reçus while (window.pollEvent(event)) { // fermeture de la fenêtre @@ -33,16 +38,11 @@ void Manager::start() { )); } - events.push_back(event); + state->processEvent(event); } - // demande à l'état de se mettre à jour sur - // la prochaine frame - if (state == NULL) { - throw std::runtime_error("Aucune état à afficher pour le jeu"); - } - - state->frame(events); + // affichage de la prochaine frame + state->frame(); window.display(); } } diff --git a/src/menu.cpp b/src/menu.cpp index 70a4312..73165ab 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -15,10 +15,58 @@ void Menu::begin() { getWindow().setFramerateLimit(60); } -void Menu::frame(const std::vector& events) { - // traitement des événements - State::frame(events); +void Menu::processEvent(const sf::Event& event) { + // gestion des touches + if (event.type == sf::Event::KeyPressed) { + // touche flèche haut : on passe au choix précédent + if (event.key.code == sf::Keyboard::Up) { + if (selection == 0) { + selection = choices.size() - 1; + } else { + selection--; + } + } + // touche flèche bas : on passe au choix suivant + if (event.key.code == sf::Keyboard::Down) { + if (selection == choices.size() - 1) { + selection = 0; + } else { + selection++; + } + } + + // touche entrée : on exécute le choix sélectionné + if (event.key.code == sf::Keyboard::Return) { + actions[selection](); + } + } + + // au clic, on exécute le choix pointé s'il y a lieu + if (event.type == sf::Event::MouseButtonPressed) { + sf::Vector2f position(event.mouseButton.x, event.mouseButton.y); + + for (unsigned int i = 0; i < labels.size(); i++) { + if (labels[i].getGlobalBounds().contains(position)) { + actions[i](); + return; + } + } + } + + // au déplacement de souris, on sélectionne le choix pointé s'il y a lieu + if (event.type == sf::Event::MouseMoved) { + sf::Vector2f position(event.mouseMove.x, event.mouseMove.y); + + for (unsigned int i = 0; i < labels.size(); i++) { + if (labels[i].getGlobalBounds().contains(position)) { + selection = i; + } + } + } +} + +void Menu::frame() { // titre de la fenêtre getManager().setTitle(""); @@ -87,57 +135,6 @@ void Menu::frame(const std::vector& events) { window.display(); } -void Menu::processEvent(const sf::Event& event) { - // gestion des touches - if (event.type == sf::Event::KeyPressed) { - // touche flèche haut : on passe au choix précédent - if (event.key.code == sf::Keyboard::Up) { - if (selection == 0) { - selection = choices.size() - 1; - } else { - selection--; - } - } - - // touche flèche bas : on passe au choix suivant - if (event.key.code == sf::Keyboard::Down) { - if (selection == choices.size() - 1) { - selection = 0; - } else { - selection++; - } - } - - // touche entrée : on exécute le choix sélectionné - if (event.key.code == sf::Keyboard::Return) { - actions[selection](); - } - } - - // au clic, on exécute le choix pointé s'il y a lieu - if (event.type == sf::Event::MouseButtonPressed) { - sf::Vector2f position(event.mouseButton.x, event.mouseButton.y); - - for (unsigned int i = 0; i < labels.size(); i++) { - if (labels[i].getGlobalBounds().contains(position)) { - actions[i](); - return; - } - } - } - - // au déplacement de souris, on sélectionne le choix pointé s'il y a lieu - if (event.type == sf::Event::MouseMoved) { - sf::Vector2f position(event.mouseMove.x, event.mouseMove.y); - - for (unsigned int i = 0; i < labels.size(); i++) { - if (labels[i].getGlobalBounds().contains(position)) { - selection = i; - } - } - } -} - void Menu::loadMainMenu() { choices.clear(); actions.clear(); diff --git a/src/state.cpp b/src/state.cpp index c46e684..b04cbcc 100644 --- a/src/state.cpp +++ b/src/state.cpp @@ -4,18 +4,10 @@ State::State(Manager& manager) : manager(manager) {} State::~State() {} -void State::frame(const std::vector& events) { - // traitement des événements - for (unsigned int i = 0; i < events.size(); i++) { - processEvent(events[i]); - } -} - Manager& State::getManager() { return manager; } -// raccourcis vers des méthodes du gestionnaire ResourceManager& State::getResourceManager() { return manager.getResourceManager(); }