Ajout du bloc déplaçable dans la liste & fix segfault
This commit is contained in:
		
							parent
							
								
									42fc43a83a
								
							
						
					
					
						commit
						48adba301e
					
				|  | @ -13,7 +13,10 @@ | |||
| struct ToolbarObject { | ||||
|     typedef std::shared_ptr<ToolbarObject> Ptr; | ||||
| 
 | ||||
|     // image représentant cet objet visuellement
 | ||||
|     sf::Sprite sprite; | ||||
| 
 | ||||
|     // fonction appelée pour instancier un objet de ce type
 | ||||
|     std::function<Object::Ptr(void)> create_object; | ||||
| }; | ||||
| 
 | ||||
|  | @ -23,13 +26,16 @@ struct ToolbarObject { | |||
| struct ToolbarCategory { | ||||
|     typedef std::shared_ptr<ToolbarCategory> Ptr; | ||||
| 
 | ||||
|     // nom de la catégorie
 | ||||
|     sf::String name; | ||||
| 
 | ||||
|     // liste des objets dans la catégorie
 | ||||
|     std::vector<ToolbarObject::Ptr> objects; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Ajoute un nouvel objet dans cette catégorie | ||||
|      */ | ||||
|     void addObject( | ||||
|     ToolbarObject::Ptr addObject( | ||||
|         sf::Texture& texture, | ||||
|         std::function<Object::Ptr(void)> create_object | ||||
|     ); | ||||
|  | @ -44,13 +50,18 @@ private: | |||
| 
 | ||||
|     sf::RectangleShape background; | ||||
|     std::vector<ToolbarCategory::Ptr> categories; | ||||
|     ToolbarObject* selected; | ||||
|     ToolbarObject::Ptr selected; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Crée un objet de type Block | ||||
|      */ | ||||
|     Object::Ptr createBlock(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Crée un objet de type Block déplaçable | ||||
|      */ | ||||
|     Object::Ptr createMovableBlock(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Crée un objet de type Player | ||||
|      */ | ||||
|  |  | |||
|  | @ -327,8 +327,12 @@ Object::Ptr Editor::addObject(sf::Vector2f position) { | |||
| 
 | ||||
|     // on arrondit à l'unité de grille la plus proche
 | ||||
|     position = roundVectorToGrid(position); | ||||
| 
 | ||||
|     Object::Ptr object = widget_toolbar.createObject(); | ||||
| 
 | ||||
|     if (object == nullptr) { | ||||
|         return nullptr; | ||||
|     } | ||||
| 
 | ||||
|     object->setPosition(position); | ||||
| 
 | ||||
|     // avant d'ajouter l'objet, on vérifie qu'il ne soit
 | ||||
|  |  | |||
|  | @ -8,12 +8,13 @@ const int PADDING = 8; | |||
| 
 | ||||
| ToolbarCategory::Ptr WidgetToolbar::addCategory(sf::String name) { | ||||
|     auto cat = ToolbarCategory::Ptr(new ToolbarCategory); | ||||
| 
 | ||||
|     cat->name = name; | ||||
|     categories.push_back(cat); | ||||
|     return cat; | ||||
| } | ||||
| 
 | ||||
| void ToolbarCategory::addObject( | ||||
| ToolbarObject::Ptr ToolbarCategory::addObject( | ||||
|     sf::Texture& texture, | ||||
|     std::function<Object::Ptr(void)> create_object | ||||
| ) { | ||||
|  | @ -22,12 +23,19 @@ void ToolbarCategory::addObject( | |||
|     object->sprite.setTexture(texture, true); | ||||
|     object->create_object = create_object; | ||||
|     objects.push_back(object); | ||||
|     return object; | ||||
| } | ||||
| 
 | ||||
| Object::Ptr WidgetToolbar::createBlock() { | ||||
|     return Object::Ptr(new Block); | ||||
| } | ||||
| 
 | ||||
| Object::Ptr WidgetToolbar::createMovableBlock() { | ||||
|     Object::Ptr movable = Object::Ptr(new Block); | ||||
|     movable->setMass(2.f); | ||||
|     return movable; | ||||
| } | ||||
| 
 | ||||
| Object::Ptr WidgetToolbar::createPlayer() { | ||||
|     return Object::Ptr(new Player); | ||||
| } | ||||
|  | @ -39,19 +47,28 @@ Object::Ptr WidgetToolbar::createGravityBlock(GravityDirection direction) { | |||
| } | ||||
| 
 | ||||
| Object::Ptr WidgetToolbar::createObject() { | ||||
|     return selected->create_object(); | ||||
|     if (selected != nullptr) { | ||||
|         return selected->create_object(); | ||||
|     } | ||||
| 
 | ||||
|     return nullptr; | ||||
| } | ||||
| 
 | ||||
| WidgetToolbar::WidgetToolbar(Manager& manager) : manager(manager), selected(NULL) { | ||||
| WidgetToolbar::WidgetToolbar(Manager& manager) : manager(manager), selected(nullptr) { | ||||
|     // catégorie des objets plaçables de base
 | ||||
|     ResourceManager& resources = manager.getResourceManager(); | ||||
|     ToolbarCategory::Ptr basic_cat = addCategory("BASE"); | ||||
| 
 | ||||
|     basic_cat->addObject( | ||||
|     selected = basic_cat->addObject( | ||||
|         resources.getTexture("toolbar_block.tga"), | ||||
|         std::bind(&WidgetToolbar::createBlock, this) | ||||
|     ); | ||||
| 
 | ||||
|     basic_cat->addObject( | ||||
|         resources.getTexture("toolbar_movable_block.tga"), | ||||
|         std::bind(&WidgetToolbar::createMovableBlock, this) | ||||
|     ); | ||||
| 
 | ||||
|     basic_cat->addObject( | ||||
|         resources.getTexture("toolbar_player.tga"), | ||||
|         std::bind(&WidgetToolbar::createPlayer, this) | ||||
|  | @ -90,7 +107,7 @@ bool WidgetToolbar::processEvent(const sf::Event& event) { | |||
|             for (unsigned int i = 0; i < categories.size(); i++) { | ||||
|                 for (unsigned int j = 0; j < categories[i]->objects.size(); j++) { | ||||
|                     if (categories[i]->objects[j]->sprite.getGlobalBounds().contains(position)) { | ||||
|                         selected = categories[i]->objects[j].get(); | ||||
|                         selected = categories[i]->objects[j]; | ||||
|                         return true; | ||||
|                     } | ||||
|                 } | ||||
|  | @ -141,7 +158,7 @@ void WidgetToolbar::draw(sf::Vector2f position, sf::Vector2f size) { | |||
|                 total_y | ||||
|             ); | ||||
| 
 | ||||
|             if (selected == object.get()) { | ||||
|             if (selected == object) { | ||||
|                 sf::RectangleShape selection_rectangle(sf::Vector2f(32, 32)); | ||||
|                 selection_rectangle.setPosition(sprite_position + sf::Vector2f(-4, -4)); | ||||
|                 selection_rectangle.setFillColor(sf::Color(0, 0, 0, 20)); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue