Nettoyage et améliorations du menu
This commit is contained in:
		
							parent
							
								
									6e51081001
								
							
						
					
					
						commit
						dc8a0e05d8
					
				|  | @ -19,7 +19,7 @@ private: | |||
|     sf::Vector2i drag_start; | ||||
|     sf::Vector2i drag_end; | ||||
|     DragMode drag_mode; | ||||
|      | ||||
| 
 | ||||
|     WidgetTimer widget_timer; | ||||
|     WidgetSelector widget_selector; | ||||
| 
 | ||||
|  | @ -84,14 +84,15 @@ public: | |||
|     virtual ~Editor(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Demande le passage à la frame suivante sur cette vue | ||||
|      * Appelé par le manager lorsque la vue commence à | ||||
|      * être utilisée | ||||
|      */ | ||||
|     virtual void frame(); | ||||
|     virtual void begin(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Charge un niveau de jeu depuis le fichier donné | ||||
|      * Demande le passage à la frame suivante sur cette vue | ||||
|      */ | ||||
|     virtual void load(std::ifstream& file); | ||||
|     virtual void frame(const std::vector<sf::Event>& events); | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -43,14 +43,15 @@ public: | |||
|     virtual ~Game(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Charge un niveau de jeu depuis le fichier donné | ||||
|      * Appelé par le manager lorsque la vue commence à | ||||
|      * être utilisée | ||||
|      */ | ||||
|     virtual void load(std::ifstream& file); | ||||
|     virtual void begin(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Demande le passage à la frame suivante sur cette vue | ||||
|      */ | ||||
|     virtual void frame(); | ||||
|     virtual void frame(const std::vector<sf::Event>& events); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Mise en mode test : l'appui sur espace renvoie | ||||
|  |  | |||
|  | @ -19,11 +19,13 @@ private: | |||
|     sf::String name; | ||||
|     int total_time; | ||||
|     sf::Sprite background; | ||||
|     std::string music_name; | ||||
| 
 | ||||
|     std::vector<ObjectPtr> objects; | ||||
|     std::vector<std::pair<float, float>> zone; | ||||
| 
 | ||||
| protected: | ||||
| 
 | ||||
|     /**
 | ||||
|      * Dessine tous les objets et le fond à l'écran | ||||
|      */ | ||||
|  | @ -60,10 +62,16 @@ public: | |||
|      */ | ||||
|     virtual void save(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Appelé par le manager lorsque la vue commence à | ||||
|      * être utilisée | ||||
|      */ | ||||
|     virtual void begin(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Demande le passage à la frame suivante sur cette vue | ||||
|      */ | ||||
|     virtual void frame(); | ||||
|     virtual void frame(const std::vector<sf::Event>& events); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Récupère le nom du niveau | ||||
|  |  | |||
|  | @ -62,12 +62,6 @@ public: | |||
|      */ | ||||
|     ResourceManager& getResourceManager(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Renvoie la liste des événements reçus pour la | ||||
|      * précédente frame | ||||
|      */ | ||||
|     const std::vector<sf::Event>& getEvents(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Remet la vue par défaut (zoom 1:1, origine en haut à gauche) | ||||
|      */ | ||||
|  |  | |||
|  | @ -2,52 +2,71 @@ | |||
| #define __PTF_MENU_HPP__ | ||||
| 
 | ||||
| #include "manager.hpp" | ||||
| #include "game.hpp" | ||||
| #include "editor.hpp" | ||||
| #include "view.hpp" | ||||
| #include "resource_manager.hpp" | ||||
| #include <SFML/Audio.hpp> | ||||
| #include <functional> | ||||
| #include <vector> | ||||
| 
 | ||||
| #define NB_CHOICES 4 | ||||
| 
 | ||||
| /**
 | ||||
|  * La classe Menu charge le menu du jeu | ||||
|  * et permet de choisir entre jouer, lire les règles | ||||
|  * et quitter. | ||||
|  */ | ||||
| class Menu : public View { | ||||
| private: | ||||
|     std::vector<sf::String> choices; | ||||
|     std::vector<std::function<void(void)>> actions; | ||||
|     unsigned int selection; | ||||
| 
 | ||||
| protected: | ||||
|     /**
 | ||||
|      * Traite l'événement donné | ||||
|      */ | ||||
|     virtual void processEvent(const sf::Event& event); | ||||
| 
 | ||||
| public: | ||||
|     Menu(Manager& manager); | ||||
|     virtual ~Menu(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Dessine le menu | ||||
|      * Appelé par le manager lorsque la vue commence à | ||||
|      * être utilisée | ||||
|      */ | ||||
|     void frame(); | ||||
|     virtual void begin(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Permet de changer le choix sélectionné | ||||
|      * Dessine le menu | ||||
|      */ | ||||
|     void MoveUp(); | ||||
|     void MoveDown(); | ||||
|     void menu1(); | ||||
|     void menu2(); | ||||
|     virtual void frame(const std::vector<sf::Event>& events); | ||||
| 
 | ||||
| private: | ||||
|     //repère le choix sélectionné
 | ||||
|     int selection; | ||||
|     /**
 | ||||
|      * Affiche le menu principal | ||||
|      */ | ||||
|     void loadMainMenu(); | ||||
| 
 | ||||
|     int menu_nb; | ||||
|     /**
 | ||||
|      * Affiche le menu de choix des niveaux | ||||
|      */ | ||||
|     void loadLevelMenu(); | ||||
| 
 | ||||
|     int positionY; | ||||
|     std::vector<std::function<void()>> menu[NB_CHOICES]; | ||||
|     sf::Font font; | ||||
|     /**
 | ||||
|      * Affiche les règles du jeu | ||||
|      */ | ||||
|     void loadRules(); | ||||
| 
 | ||||
|     //tableau de textes modélisant les différents
 | ||||
|     //choix dans le menu
 | ||||
|     sf::Text choice[NB_CHOICES]; | ||||
|     /**
 | ||||
|      * Démarre l'éditeur | ||||
|      */ | ||||
|     void launchEditor(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Démarre le jeu avec le niveau donné | ||||
|      */ | ||||
|     void launchGame(std::string name); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Quitte le jeu et le menu | ||||
|      */ | ||||
|     void quit(); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -10,9 +10,7 @@ | |||
|  */ | ||||
| struct SelectorItem { | ||||
|     sf::String name; | ||||
| 
 | ||||
|     sf::Sprite sprite; | ||||
|     sf::Sprite select_sprite; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -25,7 +23,7 @@ struct SelectorCategory { | |||
|     /**
 | ||||
|      * Ajoute un nouvel item dans cette catégorie | ||||
|      */ | ||||
|     void addItem(sf::String name, sf::Texture& texture, sf::Texture& select_texture); | ||||
|     std::shared_ptr<SelectorItem> addItem(sf::String name, sf::Texture& texture); | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -13,14 +13,25 @@ class View { | |||
| protected: | ||||
|     Manager& manager; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Traite l'événement donné | ||||
|      */ | ||||
|     virtual void processEvent(const sf::Event& event) = 0; | ||||
| 
 | ||||
| public: | ||||
|     View(Manager& manager); | ||||
|     virtual ~View(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Appelé par le manager lorsque la vue commence à | ||||
|      * être utilisée | ||||
|      */ | ||||
|     virtual void begin() = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Demande le passage à la frame suivante sur cette vue | ||||
|      */ | ||||
|     virtual void frame() = 0; | ||||
|     virtual void frame(const std::vector<sf::Event>& events); | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							|  | @ -14,26 +14,31 @@ Editor::Editor(Manager& manager) : Level(manager), drag_mode(DragMode::NONE), | |||
|     widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)), | ||||
|     widget_selector(manager) { | ||||
| 
 | ||||
|     setName("Nouveau niveau"); | ||||
|     setTotalTime(30); | ||||
| 
 | ||||
|     ResourceManager& resources = manager.getResourceManager(); | ||||
|     std::shared_ptr<SelectorCategory> basic = widget_selector.addCategory("BASE"); | ||||
|     basic->addItem("Bloc", resources.getTexture("block.png"), resources.getTexture("block_select.png")); | ||||
|     basic->addItem("Ball", resources.getTexture("ball.png"), resources.getTexture("block_select.png")); | ||||
|     basic->addItem("Block", resources.getTexture("block.png")); | ||||
|     basic->addItem("Player", resources.getTexture("player.tga")); | ||||
| } | ||||
| 
 | ||||
| Editor::~Editor() {} | ||||
| 
 | ||||
| void Editor::load(std::ifstream& file) { | ||||
|     Level::load(file); | ||||
|     manager.setTitle(sf::String(L"Édition de ") + getName()); | ||||
| void Editor::begin() { | ||||
|     Level::begin(); | ||||
|     manager.getWindow().setFramerateLimit(60); | ||||
| } | ||||
| 
 | ||||
| void Editor::frame() { | ||||
|     // traitements généraux
 | ||||
|     Level::frame(); | ||||
| void Editor::frame(const std::vector<sf::Event>& events) { | ||||
|     // traitement des événements
 | ||||
|     Level::frame(events); | ||||
| 
 | ||||
|     // titre de la fenêtre
 | ||||
|     manager.setTitle(sf::String(L"Édition de ") + getName()); | ||||
| 
 | ||||
|     // dessin de la frame
 | ||||
|     draw(); | ||||
|     sf::sleep(sf::seconds(1.f / 30)); | ||||
| } | ||||
| 
 | ||||
| void Editor::processEvent(const sf::Event& event) { | ||||
|  | @ -52,7 +57,7 @@ void Editor::processEvent(const sf::Event& event) { | |||
|     // lorsque l'on clique dans l'éditeur
 | ||||
|     if (event.type == sf::Event::MouseButtonPressed) { | ||||
|         sf::Vector2i mouse_position(event.mouseButton.x, event.mouseButton.y); | ||||
|         sf::Vector2f position = convertCoords(mouse_position); | ||||
|         sf::Vector2f position = pixelToCoords(mouse_position); | ||||
|         ObjectPtr pointed_object = getObject(position); | ||||
| 
 | ||||
|         if (event.mouseButton.button == sf::Mouse::Left) { | ||||
|  | @ -101,7 +106,7 @@ void Editor::processEvent(const sf::Event& event) { | |||
|     // lorsqu'on déplace la souris
 | ||||
|     if (event.type == sf::Event::MouseMoved) { | ||||
|         sf::Vector2i mouse_position(event.mouseMove.x, event.mouseMove.y); | ||||
|         sf::Vector2f position = convertCoords(mouse_position); | ||||
|         sf::Vector2f position = pixelToCoords(mouse_position); | ||||
|         ObjectPtr pointed_object = getObject(position); | ||||
| 
 | ||||
|         drag_end = mouse_position; | ||||
|  | @ -126,7 +131,7 @@ void Editor::processEvent(const sf::Event& event) { | |||
|     if (event.type == sf::Event::MouseButtonReleased) { | ||||
|         // mode sélection rectangulaire : on applique la sélection
 | ||||
|         if (drag_mode == DragMode::SELECT_RECT) { | ||||
|             select(convertCoords(drag_start), convertCoords(drag_end)); | ||||
|             select(pixelToCoords(drag_start), pixelToCoords(drag_end)); | ||||
|         } | ||||
| 
 | ||||
|         drag_mode = DragMode::NONE; | ||||
|  |  | |||
							
								
								
									
										16
									
								
								src/game.cpp
								
								
								
								
							
							
						
						
									
										16
									
								
								src/game.cpp
								
								
								
								
							|  | @ -12,14 +12,17 @@ Game::Game(Manager& manager) : Level(manager), | |||
| 
 | ||||
| Game::~Game() {} | ||||
| 
 | ||||
| void Game::load(std::ifstream& file) { | ||||
|     Level::load(file); | ||||
|     manager.setTitle(getName()); | ||||
| void Game::begin() { | ||||
|     Level::begin(); | ||||
|     manager.getWindow().setFramerateLimit(0); | ||||
| } | ||||
| 
 | ||||
| void Game::frame() { | ||||
|     // traitements généraux
 | ||||
|     Level::frame(); | ||||
| void Game::frame(const std::vector<sf::Event>& events) { | ||||
|     // traitement des événements
 | ||||
|     Level::frame(events); | ||||
| 
 | ||||
|     // titre de la fenêtre
 | ||||
|     manager.setTitle(getName()); | ||||
| 
 | ||||
|     sf::Time current_time = manager.getCurrentTime(); | ||||
| 
 | ||||
|  | @ -67,7 +70,6 @@ void Game::draw() { | |||
| } | ||||
| 
 | ||||
| void Game::ensureCentered() { | ||||
|     sf::Vector2i window_size = (sf::Vector2i) manager.getWindow().getSize(); | ||||
|     std::vector<ObjectPtr>& objects = getObjects(); | ||||
| 
 | ||||
|     sf::Vector2f total_position; | ||||
|  |  | |||
|  | @ -17,14 +17,8 @@ std::map<unsigned int, std::function<ObjectPtr(std::ifstream&)>> object_type_map | |||
|     {Block::TYPE_ID, Block::load} | ||||
| }; | ||||
| 
 | ||||
| Level::Level(Manager& manager) : View(manager), total_time(30) { | ||||
|     camera = manager.getWindow().getDefaultView(); | ||||
|     camera.setCenter(0, 0); | ||||
| } | ||||
| 
 | ||||
| Level::~Level() { | ||||
|     objects.clear(); | ||||
| } | ||||
| Level::Level(Manager& manager) : View(manager) {} | ||||
| Level::~Level() {} | ||||
| 
 | ||||
| void Level::load(std::ifstream& file) { | ||||
|     // vide le niveau précédent s'il y a lieu
 | ||||
|  | @ -82,13 +76,10 @@ void Level::load(std::ifstream& file) { | |||
|     } | ||||
| 
 | ||||
|     // lecture des chemins de la musique et du fond
 | ||||
|     std::string music_name, background_name; | ||||
|     std::string background_name; | ||||
|     ResourceManager& resource_manager = manager.getResourceManager(); | ||||
| 
 | ||||
|     std::getline(file, music_name, '\0'); | ||||
|     resource_manager.setMusic(music_name); | ||||
|     resource_manager.playMusic(); | ||||
| 
 | ||||
|     std::getline(file, background_name, '\0'); | ||||
|     background.setTexture(resource_manager.getTexture(background_name)); | ||||
| 
 | ||||
|  | @ -118,15 +109,23 @@ void Level::save() { | |||
|     // TODO: faire une fonction d'enregistrement
 | ||||
| } | ||||
| 
 | ||||
| void Level::frame() { | ||||
|     const std::vector<sf::Event>& events = manager.getEvents(); | ||||
| void Level::begin() { | ||||
|     ResourceManager& resources = manager.getResourceManager(); | ||||
| 
 | ||||
|     // traitement des événements
 | ||||
|     for (unsigned int i = 0; i < events.size(); i++) { | ||||
|         processEvent(events[i]); | ||||
|     camera = manager.getWindow().getDefaultView(); | ||||
|     camera.setCenter(0, 0); | ||||
| 
 | ||||
|     if (music_name != "") { | ||||
|         resources.setMusic(music_name); | ||||
|         resources.playMusic(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Level::frame(const std::vector<sf::Event>& events) { | ||||
|     // traitement des événements
 | ||||
|     View::frame(events); | ||||
| } | ||||
| 
 | ||||
| void Level::processEvent(const sf::Event& event) { | ||||
|     // lorsque la fenêtre est redimensionnée, mise à jour
 | ||||
|     // de la taille de la caméra
 | ||||
|  |  | |||
|  | @ -11,11 +11,12 @@ void Manager::start() { | |||
| 
 | ||||
|     while (running) { | ||||
|         sf::Event event; | ||||
|         events.clear(); | ||||
|         std::vector<sf::Event> events; | ||||
| 
 | ||||
|         // si un changement de vue a été demandé, on l'effectue maintenant
 | ||||
|         if (next_view != nullptr) { | ||||
|             view = next_view; | ||||
|             next_view->begin(); | ||||
|             next_view = nullptr; | ||||
|         } | ||||
| 
 | ||||
|  | @ -26,7 +27,7 @@ void Manager::start() { | |||
|                 quit(); | ||||
|             } | ||||
| 
 | ||||
|             // redimensionnement de la fenêtre
 | ||||
|             // redimensionnement de la vue par défaut
 | ||||
|             if (event.type == sf::Event::Resized) { | ||||
|                 default_view = sf::View(sf::FloatRect( | ||||
|                     0, 0, event.size.width, event.size.height | ||||
|  | @ -42,7 +43,7 @@ void Manager::start() { | |||
|             throw std::runtime_error("Aucune vue à afficher pour le jeu"); | ||||
|         } | ||||
| 
 | ||||
|         view->frame(); | ||||
|         view->frame(events); | ||||
|         window.display(); | ||||
|     } | ||||
| } | ||||
|  | @ -73,10 +74,6 @@ ResourceManager& Manager::getResourceManager() { | |||
|     return resource_manager; | ||||
| } | ||||
| 
 | ||||
| const std::vector<sf::Event>& Manager::getEvents() { | ||||
|     return events; | ||||
| } | ||||
| 
 | ||||
| void Manager::resetDefaultView() { | ||||
|     window.setView(default_view); | ||||
| } | ||||
|  | @ -86,6 +83,10 @@ sf::String Manager::getTitle() { | |||
| } | ||||
| 
 | ||||
| void Manager::setTitle(sf::String set_title) { | ||||
|     if (title == set_title) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     title = set_title; | ||||
| 
 | ||||
|     if (title.isEmpty()) { | ||||
|  |  | |||
							
								
								
									
										260
									
								
								src/menu.cpp
								
								
								
								
							
							
						
						
									
										260
									
								
								src/menu.cpp
								
								
								
								
							|  | @ -1,151 +1,153 @@ | |||
| #include "menu.hpp" | ||||
| #include "editor.hpp" | ||||
| #include "game.hpp" | ||||
| #include <cmath> | ||||
| 
 | ||||
| Menu::Menu(Manager& manager) : View(manager){ | ||||
| const float MAX_WIDTH_PROPORTION = 1.f / 3.f; | ||||
| const float PADDING = 24.f; | ||||
| 
 | ||||
|     manager.getResourceManager().setMusic("menu.wav"); | ||||
|     manager.getResourceManager().playMusic(); | ||||
| Menu::Menu(Manager& manager) : View(manager) {} | ||||
| Menu::~Menu() {} | ||||
| 
 | ||||
|     menu1(); | ||||
|     //mise en place des propriétés des textes affichés dans le menu
 | ||||
|     choice[0].setFont(manager.getResourceManager().getFont("raleway.ttf")); | ||||
|     choice[0].setColor(sf::Color::Red); | ||||
|     choice[0].setPosition(sf::Vector2f(positionY, 400/(NB_CHOICES + 1))); | ||||
| void Menu::begin() { | ||||
|     ResourceManager& resources = manager.getResourceManager(); | ||||
| 
 | ||||
|     for(int i=1; i < NB_CHOICES; i++) | ||||
|     { | ||||
|         choice[i].setFont(manager.getResourceManager().getFont("raleway.ttf")); | ||||
|         choice[i].setColor(sf::Color::White); | ||||
|         choice[i].setPosition(sf::Vector2f(positionY, 400/((NB_CHOICES + 1))*(i+1))); | ||||
|     } | ||||
|     loadMainMenu(); | ||||
|     resources.setMusic("menu.wav"); | ||||
|     resources.playMusic(); | ||||
| 
 | ||||
|     //choix sélectionné à l'ouverture du menu
 | ||||
|     selection = 0; | ||||
|     manager.getWindow().setFramerateLimit(60); | ||||
| } | ||||
| 
 | ||||
| Menu::~Menu(){ | ||||
| } | ||||
| void Menu::frame(const std::vector<sf::Event>& events) { | ||||
|     // traitement des événements
 | ||||
|     View::frame(events); | ||||
| 
 | ||||
| void Menu::menu1(){ | ||||
|     menu_nb = 1; | ||||
|     positionY = 460; | ||||
|     // titre de la fenêtitre
 | ||||
|     manager.setTitle(""); | ||||
| 
 | ||||
|     //mise en place des textes des choix
 | ||||
|     choice[0].setString("Jouer"); | ||||
|     choice[1].setString("Regles du jeu"); | ||||
|     choice[2].setString("Creer un niveau"); | ||||
|     choice[3].setString("Quitter"); | ||||
| } | ||||
| 
 | ||||
| void Menu::menu2(){ | ||||
|     menu_nb = 2; | ||||
|     positionY = 300; | ||||
| 
 | ||||
|     //mise en place des textes des choix
 | ||||
|     choice[0].setString("Tutoriel"); | ||||
|     choice[1].setString("Niveau 1"); | ||||
|     choice[2].setString("Niveau 2"); | ||||
| } | ||||
| 
 | ||||
| void Menu::MoveUp() | ||||
| { | ||||
|     //change la couleur du choix sélectionné
 | ||||
|     if(selection-1 >= 0) | ||||
|     { | ||||
|         choice[selection].setColor(sf::Color::White); | ||||
|         selection--; | ||||
|         choice[selection].setColor(sf::Color::Red); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Menu::MoveDown() | ||||
| { | ||||
|     //change la couleur du choix sélectionné
 | ||||
|     if(selection+1 < NB_CHOICES) | ||||
|     { | ||||
|         choice[selection].setColor(sf::Color::White); | ||||
|         selection++; | ||||
|         choice[selection].setColor(sf::Color::Red); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Menu::frame(){ | ||||
|     // affichage du menu
 | ||||
|     sf::RenderWindow& window = manager.getWindow(); | ||||
|     sf::Vector2f size = (sf::Vector2f) window.getSize(); | ||||
|     sf::Font font = manager.getResourceManager().getFont("raleway.ttf"); | ||||
| 
 | ||||
|     window.clear(sf::Color(66, 40, 245)); | ||||
|     // TODO: dessiner l'image du fond
 | ||||
| 
 | ||||
|     const std::vector<sf::Event>& events = manager.getEvents(); | ||||
|     // on crée les textes pour chaque choix et on les dessine
 | ||||
|     float step = size.y / (choices.size() + 1); | ||||
|     int font_size = std::max((int) std::floor(step - PADDING), 12); | ||||
| 
 | ||||
|     for (unsigned int i = 0; i < events.size(); i++) { | ||||
|         const sf::Event& event = events[i]; | ||||
|     for (unsigned int i = 0; i < choices.size(); i++) { | ||||
|         sf::Text label(choices[i], font, 32); | ||||
|         sf::Vector2f position( | ||||
|             (1 - MAX_WIDTH_PROPORTION) * size.x, | ||||
|             step * (i + 1) - font_size / 2 | ||||
|         ); | ||||
| 
 | ||||
|         // gestion des touches
 | ||||
|         if (event.type == sf::Event::KeyPressed) { | ||||
|             if (event.key.code == sf::Keyboard::Up) { | ||||
|                 MoveUp(); | ||||
|             } | ||||
|             if (event.key.code == sf::Keyboard::Down) { | ||||
|                 MoveDown(); | ||||
|             } | ||||
|             if (event.key.code == sf::Keyboard::Return) { | ||||
|         float width = label.getGlobalBounds().width; | ||||
|         label.setPosition(position); | ||||
|         label.setColor(sf::Color::White); | ||||
| 
 | ||||
|                 //si on se trouve dans le menu 2 permettant de choisir les niveaux
 | ||||
|                 if(menu_nb == 2){ | ||||
| 
 | ||||
|                     //si on choisit "tutoriel", on charge le niveau tutoriel et on
 | ||||
|                     //la vue passe à Game
 | ||||
|                     if(selection == 0){ | ||||
|                         std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(manager)); | ||||
|                         std::string path; | ||||
| 
 | ||||
|                         switch (selection) { | ||||
|                             case 0: | ||||
|                                 path = "./levels/level1.dat"; | ||||
|                                 break; | ||||
|                         } | ||||
| 
 | ||||
|                         std::ifstream file; | ||||
|                         file.open(path, std::ios::binary | std::ios::in); | ||||
|                         game->load(file); | ||||
|                         file.close(); | ||||
| 
 | ||||
|                         manager.setView(game); | ||||
|                     } | ||||
| 
 | ||||
|                     //si on choisit "Quitter", la fenêtre se ferme
 | ||||
|                     if(selection == 3){ | ||||
|                         manager.quit(); | ||||
|                     } | ||||
|                 } | ||||
|                 if(menu_nb == 1){ | ||||
| 
 | ||||
|                     //si on choisit "jouer", la vue se met sur Lvl_menu
 | ||||
|                     if(selection==0){ | ||||
|                         menu2(); | ||||
|                     } | ||||
|                     if(selection==1){ | ||||
| 
 | ||||
|                     } | ||||
| 
 | ||||
|                     //si on choisit "créer un niveau", la vue se met sur Editor
 | ||||
|                     if(selection==2){ | ||||
|                         std::shared_ptr<View> editor = std::shared_ptr<View>(new Editor(manager)); | ||||
|                         manager.setView(editor); | ||||
|                     } | ||||
| 
 | ||||
|                     //si on choisit "quitter", la fenêtre se ferme
 | ||||
|                     if(selection==3){ | ||||
|                         manager.quit(); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
|         // si c'est le choix sélecitonné, on le souligne
 | ||||
|         if (selection == i) { | ||||
|             sf::RectangleShape underline(sf::Vector2f(width, 2.f)); | ||||
|             underline.setPosition(position.x, position.y + font_size / 2 + 6); | ||||
|             underline.setFillColor(sf::Color::White); | ||||
|             window.draw(underline); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     for(int i=0; i<NB_CHOICES; i++) | ||||
|     { | ||||
|         window.draw(choice[i]); | ||||
|         window.draw(label); | ||||
|     } | ||||
| 
 | ||||
|     window.display(); | ||||
| } | ||||
| 
 | ||||
| void Menu::processEvent(const sf::Event& event) { | ||||
|     // gestion des touches
 | ||||
|     if (event.type == sf::Event::KeyPressed) { | ||||
|         // touche flèche haut : on passe au choix précédent
 | ||||
|         if (event.key.code == sf::Keyboard::Up) { | ||||
|             if (selection == 0) { | ||||
|                 selection = choices.size() - 1; | ||||
|             } else { | ||||
|                 selection--; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // touche flèche bas : on passe au choix suivant
 | ||||
|         if (event.key.code == sf::Keyboard::Down) { | ||||
|             if (selection == choices.size()) { | ||||
|                 selection = 0; | ||||
|             } else { | ||||
|                 selection++; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // touche entrée : on exécute le choix sélectionné
 | ||||
|         if (event.key.code == sf::Keyboard::Return) { | ||||
|             actions[selection](); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Menu::loadMainMenu() { | ||||
|     choices.clear(); | ||||
|     actions.clear(); | ||||
|     selection = 0; | ||||
| 
 | ||||
|     choices.push_back(sf::String(L"Jouer")); | ||||
|     actions.push_back(std::bind(&Menu::loadLevelMenu, this)); | ||||
| 
 | ||||
|     choices.push_back(sf::String(L"Règles du jeu")); | ||||
|     actions.push_back(std::bind(&Menu::loadRules, this)); | ||||
| 
 | ||||
|     choices.push_back(sf::String(L"Éditeur")); | ||||
|     actions.push_back(std::bind(&Menu::launchEditor, this)); | ||||
| 
 | ||||
|     choices.push_back(sf::String(L"Quitter")); | ||||
|     actions.push_back(std::bind(&Menu::quit, this)); | ||||
| } | ||||
| 
 | ||||
| void Menu::loadLevelMenu() { | ||||
|     choices.clear(); | ||||
|     actions.clear(); | ||||
|     selection = 0; | ||||
| 
 | ||||
|     choices.push_back(sf::String(L"Tutoriel")); | ||||
|     actions.push_back(std::bind(&Menu::launchGame, this, "level1.dat")); | ||||
| 
 | ||||
|     choices.push_back(sf::String(L"Niveau 1")); | ||||
|     actions.push_back(std::bind(&Menu::launchGame, this, "level2.dat")); | ||||
| 
 | ||||
|     choices.push_back(sf::String(L"Niveau 2")); | ||||
|     actions.push_back(std::bind(&Menu::launchGame, this, "level3.dat")); | ||||
| 
 | ||||
|     choices.push_back(sf::String(L"Retour")); | ||||
|     actions.push_back(std::bind(&Menu::loadMainMenu, this)); | ||||
| } | ||||
| 
 | ||||
| void Menu::loadRules() { | ||||
|     // TODO: coder l'affichage des règles
 | ||||
| } | ||||
| 
 | ||||
| void Menu::launchEditor() { | ||||
|     std::shared_ptr<View> editor = std::shared_ptr<View>(new Editor(manager)); | ||||
|     manager.setView(editor); | ||||
| } | ||||
| 
 | ||||
| void Menu::launchGame(std::string name) { | ||||
|     std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(manager)); | ||||
|     std::string path = "./levels/" + name; | ||||
| 
 | ||||
|     std::ifstream file; | ||||
|     file.open(path, std::ios::binary | std::ios::in); | ||||
|     game->load(file); | ||||
|     file.close(); | ||||
| 
 | ||||
|     manager.setView(game); | ||||
| } | ||||
| 
 | ||||
| void Menu::quit() { | ||||
|     manager.quit(); | ||||
| } | ||||
|  |  | |||
|  | @ -15,22 +15,20 @@ std::shared_ptr<SelectorCategory> WidgetSelector::addCategory(sf::String name) { | |||
|     return cat; | ||||
| } | ||||
| 
 | ||||
| void SelectorCategory::addItem(sf::String name, sf::Texture& texture, sf::Texture& select_texture) { | ||||
| std::shared_ptr<SelectorItem> SelectorCategory::addItem(sf::String name, sf::Texture& texture) { | ||||
|     auto item = std::shared_ptr<SelectorItem>(new SelectorItem); | ||||
|     item->sprite.setTexture(texture, true); | ||||
|     item->select_sprite.setTexture(select_texture, true); | ||||
| 
 | ||||
|     float width = item->sprite.getLocalBounds().width; | ||||
| 
 | ||||
|     // mise à l'échelle si trop grand ou trop petit
 | ||||
|     if (width < 20 || width > 28) { | ||||
|         item->sprite.scale(24 / width, 24 / width); | ||||
|         item->select_sprite.scale(24 / width, 24 / width); | ||||
|         width = 24; | ||||
|     } | ||||
| 
 | ||||
|     item->name = name; | ||||
|     items.push_back(item); | ||||
|     return item; | ||||
| } | ||||
| 
 | ||||
| bool WidgetSelector::processEvent(const sf::Event& event) { | ||||
|  | @ -89,16 +87,9 @@ void WidgetSelector::draw(sf::Vector2f position, sf::Vector2f size) { | |||
|                 PADDING + 24 + 38 * j | ||||
|             ); | ||||
| 
 | ||||
|             // affichage des sprites des items + le sprite
 | ||||
|             // de sélection si sélectionné
 | ||||
|             // affichage du sprite de l'item
 | ||||
|             item->sprite.setPosition(sprite_position); | ||||
|             item->select_sprite.setPosition(sprite_position); | ||||
| 
 | ||||
|             window.draw(item->sprite); | ||||
| 
 | ||||
|             if (selected == item.get()) { | ||||
|                 window.draw(item->select_sprite); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,3 +2,10 @@ | |||
| 
 | ||||
| View::View(Manager& manager) : manager(manager) {} | ||||
| View::~View() {} | ||||
| 
 | ||||
| void View::frame(const std::vector<sf::Event>& events) { | ||||
|     // traitement des événements
 | ||||
|     for (unsigned int i = 0; i < events.size(); i++) { | ||||
|         processEvent(events[i]); | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue