From b7a3bc6d78533db56667f4c34feb4d88dbd06152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Wed, 20 Apr 2016 02:04:15 +0200 Subject: [PATCH] =?UTF-8?q?S=C3=A9paration=20des=20=C3=A9v=C3=A9nements=20?= =?UTF-8?q?du=20GUI=20et=20des=20=C3=A9v=C3=A9nements=20du=20jeu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/manager.hpp | 6 ++++++ src/manager.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/include/manager.hpp b/include/manager.hpp index 13b3981..445fd6c 100644 --- a/include/manager.hpp +++ b/include/manager.hpp @@ -33,6 +33,12 @@ private: State* previous_state; std::stack> states; + /** + * Détermine si l'événement donné s'est passé à l'intérieur + * de l'interface et doit être ignoré pour la suite ou non + */ + bool isInsideGUI(const sf::Event& event); + public: /** * Énumération des modificateurs diff --git a/src/manager.cpp b/src/manager.cpp index ca3d254..9f65ce8 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -67,7 +67,11 @@ void Manager::start() { return; } - states.top()->processEvent(event); + // seulement si l'événement ne s'est pas passé dans l'interface + // on le fait passer aux gestionnaires "normaux" + if (!isInsideGUI(event)) { + states.top()->processEvent(event); + } } // s'il n'y a plus d'état, on quitte @@ -143,6 +147,42 @@ void Manager::useGUIView() { window.setView(gui_view); } +bool Manager::isInsideGUI(const sf::Event& event) { + sf::Vector2f check_point; + bool should_check_point = false; + + if (event.type == sf::Event::MouseButtonPressed || + event.type == sf::Event::MouseButtonReleased) { + check_point.x = event.mouseButton.x; + check_point.y = event.mouseButton.y; + should_check_point = true; + } + + if (event.type == sf::Event::MouseMoved) { + check_point.x = event.mouseMove.x; + check_point.y = event.mouseMove.y; + should_check_point = true; + } + + if (event.type == sf::Event::MouseWheelScrolled) { + check_point.x = event.mouseWheelScroll.x; + check_point.y = event.mouseWheelScroll.y; + should_check_point = true; + } + + // si l'événement est de type souris, on regarde que + // le point en question ne se trouve pas dans un des widgets + if (should_check_point) { + for (auto const &widget : widgets) { + if (widget->GetAllocation().contains(check_point)) { + return true; + } + } + } + + return false; +} + void Manager::addWidget(sfg::Widget::Ptr widget) { widgets.push_back(widget); desktop.Add(widget);