diff --git a/src/input.cpp b/src/input.cpp index ce979aa..e4704c1 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -11,7 +11,8 @@ Input::Input(sf::Window *w) : m_window(w), - m_closeRequested(false) + m_closeRequested(false), + m_mouseGrabbed(false) { m_heldkeys = std::vector(); m_actions = std::vector(); @@ -31,12 +32,18 @@ void Input::updateEvents(){ m_closeRequested = false; m_hasBeenResized = false; m_delta_vertical_scroll = 0; - m_last_mouse_position = m_mouse_position; + + if(m_mouseGrabbed) + m_last_mouse_position = sf::Vector2i(m_window->getSize())/2; + else + m_last_mouse_position = m_mouse_position; /* global affectation */ kb = m_keybindings[m_current_context]; m_actions.clear(); + int action; + /* event-parsing loop */ while(m_window->pollEvent(event)) { @@ -49,28 +56,36 @@ void Input::updateEvents(){ c = (char) event.text.unicode; m_buffer.push_back(c); break; - case sf::Event::KeyPressed: - m_actions.push_back(kb.getPressedAction(event.key.code)); + case sf::Event::KeyPressed: + action = kb.getPressedAction(event.key.code); + if(action != -1) + m_actions.push_back(action); m_heldkeys.push_back(event.key.code); break; - case sf::Event::KeyReleased: - m_actions.push_back(kb.getReleasedAction(event.key.code)); + case sf::Event::KeyReleased: + action = kb.getReleasedAction(event.key.code); + if(action != -1) + m_actions.push_back(action); releaseHeldKeys(event.key.code); break; case sf::Event::MouseButtonPressed: - m_actions.push_back(kb.getPressedAction(sf::Keyboard::KeyCount + event.mouseButton.button)); + action = kb.getPressedAction(sf::Keyboard::KeyCount + event.mouseButton.button); + if(action != -1) + m_actions.push_back(action); m_heldkeys.push_back((sf::Keyboard::Key) (sf::Keyboard::KeyCount + event.mouseButton.button)); break; case sf::Event::MouseButtonReleased: - m_actions.push_back(kb.getReleasedAction(sf::Keyboard::KeyCount + event.mouseButton.button)); + action = kb.getReleasedAction(sf::Keyboard::KeyCount + event.mouseButton.button); + if(action != -1) + m_actions.push_back(action); releaseHeldKeys((sf::Keyboard::Key) (sf::Keyboard::KeyCount + event.mouseButton.button)); break; case sf::Event::MouseWheelScrolled: if (event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel) m_delta_vertical_scroll = event.mouseWheelScroll.delta; break; - case sf::Event::MouseMoved: - m_mouse_position = sf::Mouse::getPosition(); + case sf::Event::MouseMoved: + m_mouse_position = sf::Mouse::getPosition(*m_window); break; case sf::Event::MouseEntered: // action MouseEntered @@ -80,9 +95,13 @@ void Input::updateEvents(){ break; case sf::Event::Resized: m_hasBeenResized = true; + if(m_mouseGrabbed) + m_last_mouse_position = sf::Vector2i(m_window->getSize())/2; break; } } + if(m_mouseGrabbed) + sf::Mouse::setPosition(m_last_mouse_position, *m_window); for (auto key: m_heldkeys) { m_actions.push_back(kb.getHoldAction(key)); @@ -155,6 +174,13 @@ float Input::getDeltaVerticalScroll() const return m_delta_vertical_scroll; } +void Input::setMouseGrabbed(bool isGrabbed) +{ + m_mouseGrabbed = isGrabbed; + if(isGrabbed) + m_last_mouse_position = sf::Vector2i(m_window->getSize())/2; +} + std::string Input::getText() { std::string t = m_buffer; diff --git a/src/input.h b/src/input.h index 30a2886..1958ef6 100644 --- a/src/input.h +++ b/src/input.h @@ -35,6 +35,7 @@ private: sf::Vector2i m_mouse_position; sf::Vector2i m_last_mouse_position; float m_delta_vertical_scroll; + bool m_mouseGrabbed; /* text-related variable */ std::string m_buffer; @@ -65,6 +66,11 @@ public: sf::Vector2i getDeltaPosition() const; float getDeltaVerticalScroll() const; + /* Mouse grabbing */ + void setMouseGrabbed(bool isGrabbed); + void toggleMouseGrab() { setMouseGrabbed(!m_mouseGrabbed); } + bool isMouseGrabbed() const { return m_mouseGrabbed; } + /* text-related function */ std::string getText(); diff --git a/src/keybindings.cpp b/src/keybindings.cpp index f0eb4fa..9b2f0c8 100644 --- a/src/keybindings.cpp +++ b/src/keybindings.cpp @@ -31,6 +31,7 @@ std::vector IKeysMap::getBindings(int action) const { KeyBindings::KeyBindings() { } + KeyBindings::KeyBindings(const Context &context, const IKeysMap &keysmap) { for (int action : context.getActions()){