| 
									
										
										
										
											2016-04-12 16:11:36 +00:00
										 |  |  |  | #include "state.hpp"
 | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  | #include "manager.hpp"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-10 02:47:02 +00:00
										 |  |  |  | const unsigned int Manager::FPS = 60; | 
					
						
							|  |  |  |  | const sf::Time Manager::FRAME_TIME = sf::seconds(1.f / Manager::FPS); | 
					
						
							| 
									
										
										
										
											2016-04-12 16:11:36 +00:00
										 |  |  |  | const float Manager::GRID = 32; | 
					
						
							| 
									
										
										
										
											2016-04-10 02:47:02 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-17 13:25:21 +00:00
										 |  |  |  | Manager::Manager() : title(sf::String(L"")), previous_state(nullptr) { | 
					
						
							| 
									
										
										
										
											2016-04-10 10:27:06 +00:00
										 |  |  |  |     // préchargement des textures
 | 
					
						
							|  |  |  |  |     resource_manager.preload(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     // création de la fenêtre (après avoir préchargé les ressources,
 | 
					
						
							|  |  |  |  |     // on évite ainsi tout lag pendant le traitement des événements)
 | 
					
						
							|  |  |  |  |     window.create( | 
					
						
							|  |  |  |  |         sf::VideoMode(704, 480), "Skizzle", sf::Style::Default, | 
					
						
							|  |  |  |  |         sf::ContextSettings(0, 0, 2) | 
					
						
							|  |  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2016-04-10 18:34:29 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     // récupération de la vue par défaut comme vue du gui
 | 
					
						
							|  |  |  |  |     gui_view = window.getDefaultView(); | 
					
						
							| 
									
										
										
										
											2016-04-10 10:27:06 +00:00
										 |  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | void Manager::start() { | 
					
						
							| 
									
										
										
										
											2016-04-11 19:11:34 +00:00
										 |  |  |  |     while (!states.empty()) { | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  |         sf::Event event; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // traitement des évènements reçus
 | 
					
						
							|  |  |  |  |         while (window.pollEvent(event)) { | 
					
						
							| 
									
										
										
										
											2016-04-11 19:11:34 +00:00
										 |  |  |  |             // fermeture de la fenêtre : on dépile tous les états
 | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  |             if (event.type == sf::Event::Closed) { | 
					
						
							| 
									
										
										
										
											2016-04-11 19:11:34 +00:00
										 |  |  |  |                 while (!states.empty()) { | 
					
						
							|  |  |  |  |                     states.pop(); | 
					
						
							|  |  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-09 00:32:11 +00:00
										 |  |  |  |             // redimensionnement de la vue par défaut
 | 
					
						
							| 
									
										
										
										
											2016-04-08 00:21:19 +00:00
										 |  |  |  |             if (event.type == sf::Event::Resized) { | 
					
						
							| 
									
										
										
										
											2016-04-10 18:34:29 +00:00
										 |  |  |  |                 gui_view = sf::View(sf::FloatRect( | 
					
						
							| 
									
										
										
										
											2016-04-08 00:21:19 +00:00
										 |  |  |  |                     0, 0, event.size.width, event.size.height | 
					
						
							|  |  |  |  |                 )); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 19:11:34 +00:00
										 |  |  |  |             // s'il n'y a plus d'état, on quitte
 | 
					
						
							|  |  |  |  |             if (states.empty()) { | 
					
						
							|  |  |  |  |                 return; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             states.top()->processEvent(event); | 
					
						
							|  |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-04-12 16:11:36 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 19:11:34 +00:00
										 |  |  |  |         // s'il n'y a plus d'état, on quitte
 | 
					
						
							|  |  |  |  |         if (states.empty()) { | 
					
						
							|  |  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-17 13:25:21 +00:00
										 |  |  |  |         // 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
 | 
					
						
							| 
									
										
										
										
											2016-04-11 19:11:34 +00:00
										 |  |  |  |         states.top()->frame(); | 
					
						
							| 
									
										
										
										
											2016-04-05 15:50:28 +00:00
										 |  |  |  |         window.display(); | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 19:11:34 +00:00
										 |  |  |  | void Manager::pushState(std::unique_ptr<State> set_state) { | 
					
						
							|  |  |  |  |     states.push(std::move(set_state)); | 
					
						
							| 
									
										
										
										
											2016-04-05 23:13:00 +00:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 19:11:34 +00:00
										 |  |  |  | void Manager::popState() { | 
					
						
							|  |  |  |  |     states.pop(); | 
					
						
							| 
									
										
										
										
											2016-03-28 17:57:55 +00:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  | sf::RenderWindow& Manager::getWindow() { | 
					
						
							|  |  |  |  |     return window; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 18:11:51 +00:00
										 |  |  |  | unsigned int Manager::getFramerate() { | 
					
						
							|  |  |  |  |     return framerate; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void Manager::setFramerate(unsigned int set_framerate) { | 
					
						
							|  |  |  |  |     // on ne modifie le framerate maximal que s'il a changé
 | 
					
						
							|  |  |  |  |     if (set_framerate != framerate) { | 
					
						
							|  |  |  |  |         window.setFramerateLimit(set_framerate); | 
					
						
							|  |  |  |  |         framerate = set_framerate; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-03 18:19:48 +00:00
										 |  |  |  | sf::Time Manager::getCurrentTime() const { | 
					
						
							|  |  |  |  |     return clock.getElapsedTime(); | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ResourceManager& Manager::getResourceManager() { | 
					
						
							|  |  |  |  |     return resource_manager; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-10 18:34:29 +00:00
										 |  |  |  | void Manager::useGUIView() { | 
					
						
							|  |  |  |  |     window.setView(gui_view); | 
					
						
							| 
									
										
										
										
											2016-04-05 15:50:28 +00:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-06 11:41:12 +00:00
										 |  |  |  | sf::String Manager::getTitle() { | 
					
						
							| 
									
										
										
										
											2016-04-05 18:07:58 +00:00
										 |  |  |  |     return title; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-06 11:41:12 +00:00
										 |  |  |  | void Manager::setTitle(sf::String set_title) { | 
					
						
							| 
									
										
										
										
											2016-04-12 18:11:51 +00:00
										 |  |  |  |     if (title != set_title) { | 
					
						
							|  |  |  |  |         title = set_title; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // màj du titre selon le titre donné par l'état
 | 
					
						
							|  |  |  |  |         if (title.isEmpty()) { | 
					
						
							|  |  |  |  |             window.setTitle(sf::String(L"Skizzle")); | 
					
						
							|  |  |  |  |         } else { | 
					
						
							|  |  |  |  |             window.setTitle(sf::String(L"Skizzle ‒ ") + title); | 
					
						
							|  |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-04-05 18:07:58 +00:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  | bool Manager::isKeyPressed(sf::Keyboard::Key key) const { | 
					
						
							| 
									
										
										
										
											2016-04-04 17:53:54 +00:00
										 |  |  |  |     return sf::Keyboard::isKeyPressed(key) && window.hasFocus(); | 
					
						
							| 
									
										
										
										
											2016-03-28 15:23:47 +00:00
										 |  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-04-09 23:29:42 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | bool Manager::isKeyPressed(Manager::Modifier modifier) const { | 
					
						
							|  |  |  |  |     switch (modifier) { | 
					
						
							|  |  |  |  |     case Manager::Modifier::CONTROL: | 
					
						
							|  |  |  |  |         return isKeyPressed(sf::Keyboard::LControl) || isKeyPressed(sf::Keyboard::RControl); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     case Manager::Modifier::ALT: | 
					
						
							|  |  |  |  |         return isKeyPressed(sf::Keyboard::LAlt) || isKeyPressed(sf::Keyboard::RAlt); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     case Manager::Modifier::SYSTEM: | 
					
						
							|  |  |  |  |         return isKeyPressed(sf::Keyboard::LSystem) || isKeyPressed(sf::Keyboard::RSystem); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     case Manager::Modifier::SHIFT: | 
					
						
							|  |  |  |  |         return isKeyPressed(sf::Keyboard::LShift) || isKeyPressed(sf::Keyboard::RShift); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     return false; | 
					
						
							|  |  |  |  | } |