Meilleure gestion des changements de vue & quitter
This commit is contained in:
		
							parent
							
								
									266c0529d9
								
							
						
					
					
						commit
						14086f1e05
					
				|  | @ -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é | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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<sf::Event> events; | ||||
| 
 | ||||
|     std::shared_ptr<View> view; | ||||
|     std::shared_ptr<View> 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 | ||||
|      */ | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ public: | |||
|     /**
 | ||||
|      * Dessine le menu | ||||
|      */ | ||||
|     bool frame(); | ||||
|     void frame(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Permet de changer le choix sélectionné | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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() { | ||||
|  |  | |||
							
								
								
									
										30
									
								
								src/game.cpp
								
								
								
								
							
							
						
						
									
										30
									
								
								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() { | ||||
|  |  | |||
|  | @ -118,31 +118,21 @@ void Level::save() { | |||
|     // TODO: faire une fonction d'enregistrement
 | ||||
| } | ||||
| 
 | ||||
| bool Level::frame() { | ||||
| void Level::frame() { | ||||
|     const std::vector<sf::Event>& 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() { | ||||
|  |  | |||
|  | @ -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<View> Manager::getView() { | ||||
|     return view; | ||||
| } | ||||
| 
 | ||||
| void Manager::setView(std::shared_ptr<View> 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() { | ||||
|  |  | |||
							
								
								
									
										24
									
								
								src/menu.cpp
								
								
								
								
							
							
						
						
									
										24
									
								
								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<View> editor = std::shared_ptr<View>(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; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue