diff --git a/include/widget_toolbar.hpp b/include/widget_toolbar.hpp index 3e40f0a..3c3481b 100644 --- a/include/widget_toolbar.hpp +++ b/include/widget_toolbar.hpp @@ -13,7 +13,10 @@ struct ToolbarObject { typedef std::shared_ptr Ptr; + // image représentant cet objet visuellement sf::Sprite sprite; + + // fonction appelée pour instancier un objet de ce type std::function create_object; }; @@ -23,13 +26,16 @@ struct ToolbarObject { struct ToolbarCategory { typedef std::shared_ptr Ptr; + // nom de la catégorie sf::String name; + + // liste des objets dans la catégorie std::vector objects; /** * Ajoute un nouvel objet dans cette catégorie */ - void addObject( + ToolbarObject::Ptr addObject( sf::Texture& texture, std::function create_object ); @@ -44,13 +50,18 @@ private: sf::RectangleShape background; std::vector 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 */ diff --git a/src/editor.cpp b/src/editor.cpp index 9271552..4ded761 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -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 diff --git a/src/widget_toolbar.cpp b/src/widget_toolbar.cpp index ecbf540..59162f7 100644 --- a/src/widget_toolbar.cpp +++ b/src/widget_toolbar.cpp @@ -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 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));