From 38fbcbe480e20cc4996ca7273990fd485be39bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sun, 10 Apr 2016 13:40:43 +0200 Subject: [PATCH] =?UTF-8?q?Suppression=20de=20points=20de=20contr=C3=B4le?= =?UTF-8?q?=20:=20clic=20droit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/editor.hpp | 15 +++++- res/textures/block.tga | Bin 2738 -> 1549 bytes res/textures/gravity_block_south.tga | Bin 4084 -> 2487 bytes src/editor.cpp | 72 +++++++++++++++++++-------- 4 files changed, 63 insertions(+), 24 deletions(-) diff --git a/include/editor.hpp b/include/editor.hpp index ef77f52..d4717fb 100644 --- a/include/editor.hpp +++ b/include/editor.hpp @@ -16,11 +16,11 @@ enum class SelectionMode {REPLACE, FLIP, ADD}; class Editor : public Level { private: std::vector selection; - std::vector zone_control_points; + std::vector control_points_circles; sf::Vector2i drag_start; sf::Vector2i drag_end; - int drag_control_point; + sf::Vector2f *drag_control_point; DragMode drag_mode; @@ -33,6 +33,12 @@ private: */ Object::Ptr getObject(sf::Vector2f position); + /** + * Renvoie le point de contrôle à la position donnée + * ou nullptr si aucun + */ + sf::Vector2f* getControlPoint(sf::Vector2f position); + /** * Ajoute un objet du type actuel à la position donnée */ @@ -44,6 +50,11 @@ private: void removeObject(Object::Ptr object); void removeObject(sf::Vector2f position); + /** + * Supprime le point de contrôle passé par pointeur + */ + void removeControlPoint(sf::Vector2f* control_point); + /** * Ajoute l'objet/les objets donné(s) (par position, entre deux * positions ou par pointeur) à la sélection diff --git a/res/textures/block.tga b/res/textures/block.tga index 17fb033bc6044db9081c40a502876ec6b2f9c643..46ca0ac8f80c0fc95ab6cd2c5890975189f27f0b 100644 GIT binary patch literal 1549 zcmb7^Jx?N06o&8I8DRJ}6l}NI&caA%M`5Fc#7Lqm*l9_p*IWsxuysr>G@p;5VO#HGNaI1vd?Jiz? z3aZ}ic9ldS8jU`?T&~jjtY)HCsZ_r7vsv9jyOVs65WtMcJD4Zy(9kExaTuB$ zhxC~Ii1Zpv@}W>Dyy>;c#X?H?N*+gg1?c;1HapR2N(Q1SH;`V2Klz`@WX3v8X@m5H zvIyy)Q2Q>OPBSzmm@o`uLivV0{{i%EDwP_x+ii7;1G1(EL>4uSH_A-pm!O9?iA3V% zi#MlvAQa^ KXEV9A5fkr-H)C-C literal 2738 zcmeHJNlTki6#eu|Qfn7dXrUE4ENp2D4LHw=iq&Ww8#OCIaUsrYcZnGl5jToa95#ZA z(+_Y!a4nRIZ7HpSgw7OWTXB)wdtUv%Mw6BZ?aplSNZvi~oOAEH_eoN;qloZO$%=~6Dnc{j85Rs9Q;h&kA@sI8A?~`tPeB76pmq$jUkr-jGq@+aPmX?-E zPVA4w{^{vy|K8pnd3JYqDGIC6(NUklV4&gQVXCUCLaev8wl)qSh;@XHy{yC*7Z=mS z!~_iu4H2ISj)#?%mG_l+d+7M+v+yqwa~(%$gdDt}vOj4Nj`*aMXdw6Nk& zb#-;BmY&c!@>v`!fV5BqXIRnKva+%ViX!WIP;`ne_C)AneJYYAOe7ol=)k9X#L}3R(r_E+VkpEu?6%`eUTKz@uf1ae=(2J8!TGfRS ze>6f26`ni(F|XH4k$iQ0e<>fn`_$6X^26zL`aBMY!zW|a)YNo{Nq{RCY_-f?=XGjo zDrIG5Q9(fgdGhn~NyZAlc6D`$Ya#kXWZ<>XaKnhj4CM((OG`_%xw%Or8yg!WudlC@ z-EODE#6)UsZKV*w=yBXUZ*tT4z&(!^78b~}va&*&)zwuR92_Jb$kfr%A!v&>cj|N< z&sAVZ4Gj%3n6K#P%gf8Owzfti0FtqCyWNzWoJ^gaofHgm2>^ULz9hEjHY?snA7sY~ zA_S0Nk(Zn&<`;@v&tOR!tyOfZ2iBpelEL12W^s>PE-Wx@018nf7jp85It-+FXl!Bs2tw6(PbpRRhs zxw^$ke~Ze25=4qzX|d|>?-xqo3GkSeUp%?g>@+qu#&G4m$KwVnMi8b&)xh0>fdRtv z&TKa04)|Rt4>gu~-{4=Lfj>_2^!E0W4EOjEAnpt^BR66+N|7?(*xcOQE&MZvcb|Av d=H%qO!!~?O)is5+hNp&#^2g>U24kUK`U&v($shm# diff --git a/res/textures/gravity_block_south.tga b/res/textures/gravity_block_south.tga index 5c17934d632d536a98d6f8c3611974bcb6d23a99..7fe699bcd51429af3ae771b484ca346f509d0452 100644 GIT binary patch literal 2487 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 E0LuCHy8r+H diff --git a/src/editor.cpp b/src/editor.cpp index f4ad253..db2bb90 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -27,7 +27,7 @@ inline sf::Vector2f roundVectorToGrid(sf::Vector2f input) { } Editor::Editor(Manager& manager) : Level(manager), - drag_control_point(0), drag_mode(DragMode::NONE), + drag_control_point(nullptr), drag_mode(DragMode::NONE), widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)), widget_selector(manager) { @@ -56,6 +56,7 @@ void Editor::begin() { // TODO: on doit arrêter la musique car celle du // niveau est chargée par dessous dans level.. C'est sale getResourceManager().playMusic("editor.ogg"); + getWindow().setFramerateLimit(Manager::FPS); } @@ -77,17 +78,14 @@ void Editor::processEvent(const sf::Event& event) { sf::Vector2i mouse_position(event.mouseButton.x, event.mouseButton.y); sf::Vector2f position = pixelToCoords(mouse_position); Object::Ptr pointed_object = getObject(position); + sf::Vector2f* control_point = getControlPoint(position); if (event.mouseButton.button == sf::Mouse::Left) { - std::vector& zone = getZone(); - - for (unsigned int i = 0; i < zone.size(); i++) { - // clic sur un point de contrôle : déplacement du point - if (zone_control_points[i].getGlobalBounds().contains(position)) { - drag_control_point = i; - drag_mode = DragMode::CONTROL_POINT; - return; - } + // clic sur un point de contrôle : déplacement du point + if (control_point != nullptr) { + drag_control_point = control_point; + drag_mode = DragMode::CONTROL_POINT; + return; } // clic + shift : sélection par rectangle de sélection @@ -122,6 +120,12 @@ void Editor::processEvent(const sf::Event& event) { } if (event.mouseButton.button == sf::Mouse::Right) { + // clic droit sur un point de contrôle : suppression de ce point + if (control_point != nullptr) { + removeControlPoint(control_point); + return; + } + // clic droit sur un objet : démarrage de la suppression en drag&drop if (pointed_object != nullptr) { drag_start = mouse_position; @@ -144,8 +148,7 @@ void Editor::processEvent(const sf::Event& event) { // mode déplacement de point de contrôle if (drag_mode == DragMode::CONTROL_POINT) { - std::vector& zone = getZone(); - zone[drag_control_point] = roundVectorToGrid(position); + *drag_control_point = roundVectorToGrid(position); } // mode placement d'objets @@ -262,25 +265,25 @@ void Editor::draw() { // dessin de la zone de jeu const std::vector& zone = getZone(); - sf::VertexArray zone_points(sf::LinesStrip); - zone_control_points.clear(); + sf::VertexArray zone_polygon(sf::LinesStrip); + control_points_circles.clear(); for (unsigned int i = 0; i < zone.size() + 1; i++) { - sf::CircleShape control_point(5); + sf::CircleShape circle(5); sf::Vector2f position = zone[i % zone.size()]; - control_point.setOrigin(sf::Vector2f(5, 5)); - control_point.setFillColor(ZONE_POINT_COLOR); - control_point.setPosition(position); + circle.setOrigin(sf::Vector2f(5, 5)); + circle.setFillColor(ZONE_POINT_COLOR); + circle.setPosition(position); - zone_points.append(sf::Vertex(position, ZONE_BORDER_COLOR)); - zone_control_points.push_back(control_point); + zone_polygon.append(sf::Vertex(position, ZONE_BORDER_COLOR)); + control_points_circles.push_back(circle); } - window.draw(zone_points); + window.draw(zone_polygon); for (unsigned int i = 0; i < zone.size(); i++) { - window.draw(zone_control_points[i]); + window.draw(control_points_circles[i]); } // on passe au dessin d'éléments d'interface. @@ -324,6 +327,18 @@ Object::Ptr Editor::getObject(sf::Vector2f position) { return nullptr; } +sf::Vector2f* Editor::getControlPoint(sf::Vector2f position) { + std::vector& zone = getZone(); + + for (unsigned i = 0; i < zone.size(); i++) { + if (control_points_circles[i].getGlobalBounds().contains(position)) { + return &zone[i]; + } + } + + return nullptr; +} + Object::Ptr Editor::addObject(sf::Vector2f position) { std::vector& objects = getObjects(); @@ -370,6 +385,19 @@ void Editor::removeObject(Object::Ptr object) { ), objects.end()); } +void Editor::removeControlPoint(sf::Vector2f* control_point) { + if (control_point == nullptr) { + return; + } + + std::vector& zone = getZone(); + + // on supprime le point de la liste + zone.erase(std::remove( + zone.begin(), zone.end(), *control_point + ), zone.end()); +} + void Editor::removeObject(sf::Vector2f position) { removeObject(getObject(position)); }