Meilleure gestion des changements de vue & quitter

This commit is contained in:
Mattéo Delabre 2016-04-08 02:35:17 +02:00
parent 266c0529d9
commit 14086f1e05
11 changed files with 68 additions and 100 deletions

View File

@ -72,20 +72,18 @@ protected:
virtual void draw(); virtual void draw();
/** /**
* Traite un événement et renvoie true si le * Traite un événement
* dessin de la frame doit être interrompu
*/ */
virtual bool processEvent(const sf::Event& event); virtual void processEvent(const sf::Event& event);
public: public:
Editor(Manager& manager); Editor(Manager& manager);
virtual ~Editor(); virtual ~Editor();
/** /**
* Demande le passage à la frame suivante sur cette vue, * Demande le passage à la frame suivante sur cette vue
* renvoie true si le rendu de la frame a é interrompu
*/ */
virtual bool frame(); virtual void frame();
/** /**
* Charge un niveau de jeu depuis le fichier donné * Charge un niveau de jeu depuis le fichier donné

View File

@ -29,10 +29,9 @@ protected:
virtual void draw(); virtual void draw();
/** /**
* Traite un événement et renvoie true si le * Traite un événement
* dessin de la frame doit être interrompu
*/ */
virtual bool processEvent(const sf::Event& event); virtual void processEvent(const sf::Event& event);
public: public:
Game(Manager& manager); Game(Manager& manager);
@ -44,10 +43,9 @@ public:
virtual void load(std::ifstream& file); virtual void load(std::ifstream& file);
/** /**
* Demande le passage à la frame suivante sur cette vue, * Demande le passage à la frame suivante sur cette vue
* renvoie true si le rendu de la frame a é interrompu
*/ */
virtual bool frame(); virtual void frame();
/** /**
* Mise en mode test : l'appui sur espace renvoie * Mise en mode test : l'appui sur espace renvoie

View File

@ -30,10 +30,9 @@ protected:
virtual void draw(); virtual void draw();
/** /**
* Traite un événement et renvoie true si le * Traite un événement
* dessin de la frame doit être interrompu
*/ */
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 * Convertit les coordonnées à l'écran en coordonnées du monde
@ -56,10 +55,9 @@ public:
virtual void save(); virtual void save();
/** /**
* Demande le passage à la frame suivante sur * Demande le passage à la frame suivante sur cette vue
* cette vue
*/ */
virtual bool frame(); virtual void frame();
/** /**
* Récupère le nom du niveau * Récupère le nom du niveau

View File

@ -13,14 +13,16 @@ class Manager {
private: private:
sf::RenderWindow window; sf::RenderWindow window;
sf::Clock clock; sf::Clock clock;
sf::View window_view;
sf::String title;
sf::View default_view; sf::View default_view;
sf::String title;
ResourceManager resource_manager; ResourceManager resource_manager;
std::vector<sf::Event> events; std::vector<sf::Event> events;
std::shared_ptr<View> view; std::shared_ptr<View> view;
std::shared_ptr<View> next_view;
bool running;
public: public:
Manager(); Manager();
@ -30,6 +32,11 @@ public:
*/ */
void start(); void start();
/**
* Termine la boucle principale et quitte le jeu
*/
void quit();
/** /**
* Renvoie la vue actuelle du jeu * Renvoie la vue actuelle du jeu
*/ */

View File

@ -26,7 +26,7 @@ public:
/** /**
* Dessine le menu * Dessine le menu
*/ */
bool frame(); void frame();
/** /**
* Permet de changer le choix sélectionné * Permet de changer le choix sélectionné

View File

@ -18,10 +18,9 @@ public:
virtual ~View(); virtual ~View();
/** /**
* Demande le passage à la frame suivante sur cette vue, * Demande le passage à la frame suivante sur cette vue
* renvoie true si le rendu de la frame a é interrompu
*/ */
virtual bool frame() = 0; virtual void frame() = 0;
}; };
#endif #endif

View File

@ -21,28 +21,21 @@ void Editor::load(std::ifstream& file) {
manager.setTitle(sf::String(L"Édition de ") + getName()); manager.setTitle(sf::String(L"Édition de ") + getName());
} }
bool Editor::frame() { void Editor::frame() {
// si le dessin de la frame a été interrompu par // traitements généraux
// le traitement événementiel, on arrête Level::frame();
if (Level::frame()) {
return true;
}
// dessin de la frame // dessin de la frame
draw(); draw();
sf::sleep(sf::seconds(1.f / 30)); sf::sleep(sf::seconds(1.f / 30));
return true;
} }
bool Editor::processEvent(const sf::Event& event) { void Editor::processEvent(const sf::Event& event) {
if (Level::processEvent(event)) { Level::processEvent(event);
return true;
}
// traitement des événements du widget timer // traitement des événements du widget timer
if (widget_timer.processEvent(event)) { if (widget_timer.processEvent(event)) {
return false; return;
} }
// lorsque l'on clique dans l'éditeur // 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 // appui sur espace : test du niveau en cours d'édition
if (event.key.code == sf::Keyboard::Space) { if (event.key.code == sf::Keyboard::Space) {
test(); test();
// demande l'interruption du dessin de la
// frame car l'objet risque d'être détruit
return true;
} }
} }
return false;
} }
void Editor::draw() { void Editor::draw() {

View File

@ -13,12 +13,9 @@ void Game::load(std::ifstream& file) {
manager.setTitle(getName()); manager.setTitle(getName());
} }
bool Game::frame() { void Game::frame() {
// si le dessin de la frame a été interrompu par // traitements généraux
// le traitement événementiel, on arrête Level::frame();
if (Level::frame()) {
return true;
}
sf::Time current_time = manager.getCurrentTime(); sf::Time current_time = manager.getCurrentTime();
@ -39,32 +36,27 @@ bool Game::frame() {
// le temps nécessaire pour revenir dans les temps // le temps nécessaire pour revenir dans les temps
sf::sleep(next_frame_time - current_time); 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 // appui sur espace en mode test : retour à l'éditeur
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space && test_mode) { if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space && test_mode) {
test_mode = false; test_mode = false;
manager.setView(return_view); 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() { void Game::draw() {
sf::Vector2i window_size = (sf::Vector2i) manager.getWindow().getSize();
// dessin des objets du niveau
Level::draw(); Level::draw();
sf::View window_view = manager.getWindowView(); // dessin du timer
// dessin du widget
widget_timer.setTimeLeft(getTotalTime()); 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() { void Game::update() {

View File

@ -118,31 +118,21 @@ void Level::save() {
// TODO: faire une fonction d'enregistrement // TODO: faire une fonction d'enregistrement
} }
bool Level::frame() { void Level::frame() {
const std::vector<sf::Event>& events = manager.getEvents(); const std::vector<sf::Event>& events = manager.getEvents();
// traitement des événements // traitement des événements
for (unsigned int i = 0; i < events.size(); i++) { for (unsigned int i = 0; i < events.size(); i++) {
if (processEvent(events[i])) { 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;
} }
} }
return false; void Level::processEvent(const sf::Event& event) {
}
bool Level::processEvent(const sf::Event& event) {
// lorsque la fenêtre est redimensionnée, mise à jour // lorsque la fenêtre est redimensionnée, mise à jour
// de la taille de la caméra // de la taille de la caméra
if (event.type == sf::Event::Resized) { if (event.type == sf::Event::Resized) {
camera.setSize(event.size.width, event.size.height); camera.setSize(event.size.width, event.size.height);
} }
return false;
} }
void Level::draw() { void Level::draw() {

View File

@ -3,21 +3,30 @@
Manager::Manager() : window( Manager::Manager() : window(
sf::VideoMode(704, 480), "Skizzle", sf::Style::Default, sf::VideoMode(704, 480), "Skizzle", sf::Style::Default,
sf::ContextSettings(0, 0, 2) 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() { void Manager::start() {
while (window.isOpen()) { running = true;
while (running) {
sf::Event event; sf::Event event;
events.clear(); 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 // traitement des évènements reçus
while (window.pollEvent(event)) { while (window.pollEvent(event)) {
// fermeture de la fenêtre // fermeture de la fenêtre
if (event.type == sf::Event::Closed) { if (event.type == sf::Event::Closed) {
window.close(); quit();
return;
} }
// redimensionnement de la fenêtre
if (event.type == sf::Event::Resized) { if (event.type == sf::Event::Resized) {
default_view = sf::View(sf::FloatRect( default_view = sf::View(sf::FloatRect(
0, 0, event.size.width, event.size.height 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() { std::shared_ptr<View> Manager::getView() {
return view; return view;
} }
void Manager::setView(std::shared_ptr<View> set_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() { sf::RenderWindow& Manager::getWindow() {

View File

@ -68,7 +68,7 @@ void Menu::MoveDown()
} }
} }
bool Menu::frame(){ void Menu::frame(){
sf::RenderWindow& window = manager.getWindow(); sf::RenderWindow& window = manager.getWindow();
window.clear(sf::Color(66, 40, 245)); window.clear(sf::Color(66, 40, 245));
@ -108,19 +108,11 @@ bool Menu::frame(){
file.close(); file.close();
manager.setView(game); 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 //si on choisit "Quitter", la fenêtre se ferme
if(selection == 3){ if(selection == 3){
manager.getWindow().close(); manager.quit();
// demande l'interruption du dessin de la
// frame car l'objet risque d'être détruit
return true;
} }
} }
if(menu_nb == 1){ if(menu_nb == 1){
@ -137,19 +129,11 @@ bool Menu::frame(){
if(selection==2){ if(selection==2){
std::shared_ptr<View> editor = std::shared_ptr<View>(new Editor(manager)); std::shared_ptr<View> editor = std::shared_ptr<View>(new Editor(manager));
manager.setView(editor); 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 //si on choisit "quitter", la fenêtre se ferme
if(selection==3){ if(selection==3){
manager.getWindow().close(); manager.quit();
// demande l'interruption du dessin de la
// frame car l'objet risque d'être détruit
return true;
} }
} }
@ -162,6 +146,6 @@ bool Menu::frame(){
{ {
window.draw(choice[i]); window.draw(choice[i]);
} }
window.display(); window.display();
return false;
} }