Ajoute le sélecteur dans l'éditeur
This commit is contained in:
		
							parent
							
								
									9e03068357
								
							
						
					
					
						commit
						b7083b0ebd
					
				|  | @ -4,6 +4,7 @@ | |||
| #include <unordered_map> | ||||
| #include "level.hpp" | ||||
| #include "util/widget_timer.hpp" | ||||
| #include "util/widget_selector.hpp" | ||||
| 
 | ||||
| enum class DragMode {NONE, PLACE, SELECT_RECT, SELECT_BULK, REMOVE}; | ||||
| enum class SelectionMode {REPLACE, FLIP, ADD}; | ||||
|  | @ -18,7 +19,9 @@ private: | |||
|     sf::Vector2i drag_start; | ||||
|     sf::Vector2i drag_end; | ||||
|     DragMode drag_mode; | ||||
|      | ||||
|     WidgetTimer widget_timer; | ||||
|     WidgetSelector widget_selector; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Renvoie l'objet pointé à la position donnée | ||||
|  |  | |||
|  | @ -0,0 +1,61 @@ | |||
| #ifndef __PTF_UTIL_WIDGET_SELECTOR_HPP__ | ||||
| #define __PTF_UTIL_WIDGET_SELECTOR_HPP__ | ||||
| 
 | ||||
| #include <SFML/Graphics.hpp> | ||||
| #include <functional> | ||||
| #include "manager.hpp" | ||||
| 
 | ||||
| /**
 | ||||
|  * Un choix possible dans une catégorie | ||||
|  */ | ||||
| struct SelectorItem { | ||||
|     sf::String name; | ||||
| 
 | ||||
|     sf::Sprite sprite; | ||||
|     sf::Sprite select_sprite; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Représente une catégorie de choix possibles | ||||
|  */ | ||||
| struct SelectorCategory { | ||||
|     sf::String name; | ||||
|     std::vector<std::shared_ptr<SelectorItem>> items; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Ajoute un nouvel item dans cette catégorie | ||||
|      */ | ||||
|     void addItem(sf::String name, sf::Texture& texture, sf::Texture& select_texture); | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Affiche une liste de sélection | ||||
|  */ | ||||
| class WidgetSelector { | ||||
| private: | ||||
|     Manager& manager; | ||||
| 
 | ||||
|     sf::RectangleShape background; | ||||
|     std::vector<std::shared_ptr<SelectorCategory>> categories; | ||||
|     SelectorItem* selected; | ||||
| 
 | ||||
| public: | ||||
|     WidgetSelector(Manager& manager); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Ajoute une nouvelle catégorie de choix | ||||
|      */ | ||||
|     std::shared_ptr<SelectorCategory> addCategory(sf::String name); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Traite l'événement et renvoie true si l'on s'en est servi | ||||
|      */ | ||||
|     bool processEvent(const sf::Event& event); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Dessine le widget à la position donnée et avec la taille donnée | ||||
|      */ | ||||
|     void draw(sf::Vector2f position, sf::Vector2f size); | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
|  | @ -8,11 +8,18 @@ | |||
| 
 | ||||
| const sf::Color SELECTION_COLOR = sf::Color(33, 33, 33, 40); | ||||
| const sf::Color SELECTION_BORDER_COLOR = sf::Color(33, 33, 33, 127); | ||||
| const int SCROLL_SPEED = 2; | ||||
| const int SCROLL_PADDING = 8; | ||||
| const int SCROLL_SPEED = 5; | ||||
| const int SCROLL_PADDING = 5; | ||||
| 
 | ||||
| Editor::Editor(Manager& manager) : Level(manager), drag_mode(DragMode::NONE), | ||||
|     widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)) {} | ||||
|     widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)), | ||||
|     widget_selector(manager) { | ||||
| 
 | ||||
|     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")); | ||||
| } | ||||
| 
 | ||||
| Editor::~Editor() {} | ||||
| 
 | ||||
|  | @ -38,6 +45,11 @@ void Editor::processEvent(const sf::Event& event) { | |||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // traitement des événements du widget selector
 | ||||
|     if (widget_selector.processEvent(event)) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // lorsque l'on clique dans l'éditeur
 | ||||
|     if (event.type == sf::Event::MouseButtonPressed) { | ||||
|         sf::Vector2i mouse_position(event.mouseButton.x, event.mouseButton.y); | ||||
|  | @ -191,11 +203,11 @@ void Editor::draw() { | |||
|     widget_timer.setTimeLeft(getTotalTime()); | ||||
|     widget_timer.draw(sf::Vector2f(window_size.x / 2 - 50, 0)); | ||||
| 
 | ||||
|     // menu
 | ||||
|     sf::RectangleShape menu(sf::Vector2f(window_size.x, 64)); | ||||
|     menu.setPosition(sf::Vector2f(0, window_size.y - 64)); | ||||
| 
 | ||||
|     window.draw(menu); | ||||
|     // sélectionneur d'objet
 | ||||
|     widget_selector.draw( | ||||
|         sf::Vector2f(window_size.x - 64, 0), | ||||
|         sf::Vector2f(64, window_size.y) | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| ObjectPtr Editor::getObject(sf::Vector2f position) { | ||||
|  |  | |||
|  | @ -0,0 +1,106 @@ | |||
| #include <iostream> | ||||
| #include <utility> | ||||
| #include "util/widget_selector.hpp" | ||||
| 
 | ||||
| const int PADDING = 8; | ||||
| 
 | ||||
| WidgetSelector::WidgetSelector(Manager& manager) : manager(manager), selected(NULL) { | ||||
|     //
 | ||||
| } | ||||
| 
 | ||||
| std::shared_ptr<SelectorCategory> WidgetSelector::addCategory(sf::String name) { | ||||
|     auto cat = std::shared_ptr<SelectorCategory>(new SelectorCategory); | ||||
|     cat->name = name; | ||||
| 
 | ||||
|     categories.push_back(cat); | ||||
|     return cat; | ||||
| } | ||||
| 
 | ||||
| void SelectorCategory::addItem(sf::String name, sf::Texture& texture, sf::Texture& select_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); | ||||
| } | ||||
| 
 | ||||
| bool WidgetSelector::processEvent(const sf::Event& event) { | ||||
|     if (event.type == sf::Event::MouseButtonPressed) { | ||||
|         sf::Vector2f position(event.mouseButton.x, event.mouseButton.y); | ||||
| 
 | ||||
|         // clic gauche sur un item : on le sélectionne
 | ||||
|         if (event.mouseButton.button == sf::Mouse::Left) { | ||||
|             for (unsigned int i = 0; i < categories.size(); i++) { | ||||
|                 for (unsigned int j = 0; j < categories[i]->items.size(); j++) { | ||||
|                     if (categories[i]->items[j]->sprite.getGlobalBounds().contains(position)) { | ||||
|                         selected = categories[i]->items[j].get(); | ||||
|                         return true; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // ne pas laisser traverser les clics sur le sélecteur
 | ||||
|             if (background.getGlobalBounds().contains(position)) { | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| void WidgetSelector::draw(sf::Vector2f position, sf::Vector2f size) { | ||||
|     sf::RenderWindow& window = manager.getWindow(); | ||||
| 
 | ||||
|     background.setSize(size); | ||||
|     background.setPosition(position); | ||||
|     window.draw(background); | ||||
| 
 | ||||
|     for (unsigned int i = 0; i < categories.size(); i++) { | ||||
|         std::shared_ptr<SelectorCategory> category = categories[i]; | ||||
| 
 | ||||
|         // affichage du label de la catégorie
 | ||||
|         sf::Text category_label( | ||||
|             category->name, | ||||
|             manager.getResourceManager().getFont("raleway.ttf"), 12 | ||||
|         ); | ||||
| 
 | ||||
|         category_label.setColor(sf::Color::Black); | ||||
|         category_label.setPosition(position + sf::Vector2f( | ||||
|             floor(size.x / 2 - category_label.getGlobalBounds().width / 2), | ||||
|             PADDING | ||||
|         )); | ||||
| 
 | ||||
|         window.draw(category_label); | ||||
| 
 | ||||
|         for (unsigned int j = 0; j < category->items.size(); j++) { | ||||
|             std::shared_ptr<SelectorItem> item = category->items[j]; | ||||
|             sf::Vector2f sprite_position = position + sf::Vector2f( | ||||
|                 size.x / 2 - item->sprite.getGlobalBounds().width / 2, | ||||
|                 PADDING + 24 + 38 * j | ||||
|             ); | ||||
| 
 | ||||
|             // affichage des sprites des items + le sprite
 | ||||
|             // de sélection si sélectionné
 | ||||
|             item->sprite.setPosition(sprite_position); | ||||
|             item->select_sprite.setPosition(sprite_position); | ||||
| 
 | ||||
|             window.draw(item->sprite); | ||||
| 
 | ||||
|             if (selected == item.get()) { | ||||
|                 window.draw(item->select_sprite); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue