diff --git a/include/editor.hpp b/include/editor.hpp index 40910d9..83a9fbe 100644 --- a/include/editor.hpp +++ b/include/editor.hpp @@ -72,20 +72,18 @@ protected: virtual void draw(); /** - * Traite un événement et renvoie true si le - * dessin de la frame doit être interrompu + * Traite un événement */ - virtual bool processEvent(const sf::Event& event); + virtual void processEvent(const sf::Event& event); public: Editor(Manager& manager); virtual ~Editor(); /** - * Demande le passage à la frame suivante sur cette vue, - * renvoie true si le rendu de la frame a été interrompu + * Demande le passage à la frame suivante sur cette vue */ - virtual bool frame(); + virtual void frame(); /** * Charge un niveau de jeu depuis le fichier donné diff --git a/include/game.hpp b/include/game.hpp index 675dc35..269106b 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -29,10 +29,9 @@ protected: virtual void draw(); /** - * Traite un événement et renvoie true si le - * dessin de la frame doit être interrompu + * Traite un événement */ - virtual bool processEvent(const sf::Event& event); + virtual void processEvent(const sf::Event& event); public: Game(Manager& manager); @@ -44,10 +43,9 @@ public: virtual void load(std::ifstream& file); /** - * Demande le passage à la frame suivante sur cette vue, - * renvoie true si le rendu de la frame a été interrompu + * Demande le passage à la frame suivante sur cette vue */ - virtual bool frame(); + virtual void frame(); /** * Mise en mode test : l'appui sur espace renvoie diff --git a/include/level.hpp b/include/level.hpp index 84690d0..adf1c02 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -30,10 +30,9 @@ protected: virtual void draw(); /** - * Traite un événement et renvoie true si le - * dessin de la frame doit être interrompu + * Traite un événement */ - virtual bool processEvent(const sf::Event& event); + virtual void processEvent(const sf::Event& event); /** * Convertit les coordonnées à l'écran en coordonnées du monde @@ -56,10 +55,9 @@ public: virtual void save(); /** - * Demande le passage à la frame suivante sur - * cette vue + * Demande le passage à la frame suivante sur cette vue */ - virtual bool frame(); + virtual void frame(); /** * Récupère le nom du niveau diff --git a/include/manager.hpp b/include/manager.hpp index 9b91741..1588c06 100644 --- a/include/manager.hpp +++ b/include/manager.hpp @@ -13,14 +13,16 @@ class Manager { private: sf::RenderWindow window; sf::Clock clock; - sf::View window_view; - sf::String title; sf::View default_view; + sf::String title; ResourceManager resource_manager; std::vector events; std::shared_ptr view; + std::shared_ptr next_view; + + bool running; public: Manager(); @@ -30,6 +32,11 @@ public: */ void start(); + /** + * Termine la boucle principale et quitte le jeu + */ + void quit(); + /** * Renvoie la vue actuelle du jeu */ diff --git a/include/menu.hpp b/include/menu.hpp index 6b9c463..d22842d 100644 --- a/include/menu.hpp +++ b/include/menu.hpp @@ -26,7 +26,7 @@ public: /** * Dessine le menu */ - bool frame(); + void frame(); /** * Permet de changer le choix sélectionné diff --git a/include/view.hpp b/include/view.hpp index b8e1445..b91cf7e 100644 --- a/include/view.hpp +++ b/include/view.hpp @@ -18,10 +18,9 @@ public: virtual ~View(); /** - * Demande le passage à la frame suivante sur cette vue, - * renvoie true si le rendu de la frame a été interrompu + * Demande le passage à la frame suivante sur cette vue */ - virtual bool frame() = 0; + virtual void frame() = 0; }; #endif diff --git a/src/editor.cpp b/src/editor.cpp index 9f31dbe..2d89172 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -21,28 +21,21 @@ void Editor::load(std::ifstream& file) { manager.setTitle(sf::String(L"Édition de ") + getName()); } -bool Editor::frame() { - // si le dessin de la frame a été interrompu par - // le traitement événementiel, on arrête - if (Level::frame()) { - return true; - } +void Editor::frame() { + // traitements généraux + Level::frame(); // dessin de la frame draw(); sf::sleep(sf::seconds(1.f / 30)); - - return true; } -bool Editor::processEvent(const sf::Event& event) { - if (Level::processEvent(event)) { - return true; - } +void Editor::processEvent(const sf::Event& event) { + Level::processEvent(event); // traitement des événements du widget timer if (widget_timer.processEvent(event)) { - return false; + return; } // lorsque l'on clique dans l'éditeur @@ -151,14 +144,8 @@ bool Editor::processEvent(const sf::Event& event) { // appui sur espace : test du niveau en cours d'édition if (event.key.code == sf::Keyboard::Space) { test(); - - // demande l'interruption du dessin de la - // frame car l'objet risque d'être détruit - return true; } } - - return false; } void Editor::draw() { diff --git a/src/game.cpp b/src/game.cpp index 7428f5f..7865e09 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -13,12 +13,9 @@ void Game::load(std::ifstream& file) { manager.setTitle(getName()); } -bool Game::frame() { - // si le dessin de la frame a été interrompu par - // le traitement événementiel, on arrête - if (Level::frame()) { - return true; - } +void Game::frame() { + // traitements généraux + Level::frame(); sf::Time current_time = manager.getCurrentTime(); @@ -39,32 +36,27 @@ bool Game::frame() { // le temps nécessaire pour revenir dans les temps sf::sleep(next_frame_time - current_time); } - - return false; } -bool Game::processEvent(const sf::Event& event) { +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; manager.setView(return_view); - - // demande l'interruption du dessin de la - // frame car l'objet risque d'être détruit - return true; } - - return false; } void Game::draw() { + sf::Vector2i window_size = (sf::Vector2i) manager.getWindow().getSize(); + + // dessin des objets du niveau Level::draw(); - sf::View window_view = manager.getWindowView(); - - // dessin du widget + // dessin du timer widget_timer.setTimeLeft(getTotalTime()); - widget_timer.draw(sf::Vector2f(window_view.getSize().x / 2 - 50, 0)); + widget_timer.draw(sf::Vector2f(window_size.x / 2 - 50, 0)); } void Game::update() { diff --git a/src/level.cpp b/src/level.cpp index 0834cc7..f45c2e8 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -118,31 +118,21 @@ void Level::save() { // TODO: faire une fonction d'enregistrement } -bool Level::frame() { +void Level::frame() { const std::vector& events = manager.getEvents(); // traitement des événements for (unsigned int i = 0; i < events.size(); i++) { - if (processEvent(events[i])) { - // /!\ On arrête là si on a demandé l'interruption. - // Il est important de ne plus appeler aucune autre - // fonction de la classe pour éviter une erreur - // de segmentation - return true; - } + processEvent(events[i]); } - - return false; } -bool Level::processEvent(const sf::Event& event) { +void Level::processEvent(const sf::Event& event) { // lorsque la fenêtre est redimensionnée, mise à jour // de la taille de la caméra if (event.type == sf::Event::Resized) { camera.setSize(event.size.width, event.size.height); } - - return false; } void Level::draw() { diff --git a/src/manager.cpp b/src/manager.cpp index 45cf6be..f94b6a4 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -3,21 +3,30 @@ Manager::Manager() : window( sf::VideoMode(704, 480), "Skizzle", sf::Style::Default, sf::ContextSettings(0, 0, 2) -), window_view(window.getView()), title(sf::String(L"")), view(NULL) {} +), default_view(window.getDefaultView()), title(sf::String(L"")), +view(NULL), next_view(NULL), running(false) {} void Manager::start() { - while (window.isOpen()) { + running = true; + + while (running) { sf::Event event; events.clear(); + // si un changement de vue a été demandé, on l'effectue maintenant + if (next_view != nullptr) { + view = next_view; + next_view = nullptr; + } + // traitement des évènements reçus while (window.pollEvent(event)) { // fermeture de la fenêtre if (event.type == sf::Event::Closed) { - window.close(); - return; + quit(); } + // redimensionnement de la fenêtre if (event.type == sf::Event::Resized) { default_view = sf::View(sf::FloatRect( 0, 0, event.size.width, event.size.height @@ -38,12 +47,18 @@ void Manager::start() { } } +void Manager::quit() { + running = false; +} + std::shared_ptr Manager::getView() { return view; } void Manager::setView(std::shared_ptr set_view) { - view = set_view; + // on ne change pas immédiatement la vue, on attend + // la prochaine frame pour éviter toute erreur de segmentation + next_view = set_view; } sf::RenderWindow& Manager::getWindow() { diff --git a/src/menu.cpp b/src/menu.cpp index cea1ce5..9b03464 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -68,7 +68,7 @@ void Menu::MoveDown() } } -bool Menu::frame(){ +void Menu::frame(){ sf::RenderWindow& window = manager.getWindow(); window.clear(sf::Color(66, 40, 245)); @@ -108,19 +108,11 @@ bool Menu::frame(){ file.close(); manager.setView(game); - - // demande l'interruption du dessin de la - // frame car l'objet risque d'être détruit - return true; } //si on choisit "Quitter", la fenêtre se ferme if(selection == 3){ - manager.getWindow().close(); - - // demande l'interruption du dessin de la - // frame car l'objet risque d'être détruit - return true; + manager.quit(); } } if(menu_nb == 1){ @@ -137,19 +129,11 @@ bool Menu::frame(){ if(selection==2){ std::shared_ptr editor = std::shared_ptr(new Editor(manager)); manager.setView(editor); - - // demande l'interruption du dessin de la - // frame car l'objet risque d'être détruit - return true; } //si on choisit "quitter", la fenêtre se ferme if(selection==3){ - manager.getWindow().close(); - - // demande l'interruption du dessin de la - // frame car l'objet risque d'être détruit - return true; + manager.quit(); } } @@ -162,6 +146,6 @@ bool Menu::frame(){ { window.draw(choice[i]); } + window.display(); - return false; }