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