fixed NO_ACTION actions causing issues, and added mouseGrab feature

This commit is contained in:
Anselme 2016-12-21 16:46:51 +01:00
parent 273e8cc7e6
commit 2184955935
3 changed files with 43 additions and 10 deletions

View File

@ -11,7 +11,8 @@
Input::Input(sf::Window *w) : Input::Input(sf::Window *w) :
m_window(w), m_window(w),
m_closeRequested(false) m_closeRequested(false),
m_mouseGrabbed(false)
{ {
m_heldkeys = std::vector<sf::Keyboard::Key>(); m_heldkeys = std::vector<sf::Keyboard::Key>();
m_actions = std::vector<int>(); m_actions = std::vector<int>();
@ -31,12 +32,18 @@ void Input::updateEvents(){
m_closeRequested = false; m_closeRequested = false;
m_hasBeenResized = false; m_hasBeenResized = false;
m_delta_vertical_scroll = 0; 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 */ /* global affectation */
kb = m_keybindings[m_current_context]; kb = m_keybindings[m_current_context];
m_actions.clear(); m_actions.clear();
int action;
/* event-parsing loop */ /* event-parsing loop */
while(m_window->pollEvent(event)) while(m_window->pollEvent(event))
{ {
@ -49,28 +56,36 @@ void Input::updateEvents(){
c = (char) event.text.unicode; c = (char) event.text.unicode;
m_buffer.push_back(c); m_buffer.push_back(c);
break; break;
case sf::Event::KeyPressed: case sf::Event::KeyPressed:
m_actions.push_back(kb.getPressedAction(event.key.code)); action = kb.getPressedAction(event.key.code);
if(action != -1)
m_actions.push_back(action);
m_heldkeys.push_back(event.key.code); m_heldkeys.push_back(event.key.code);
break; break;
case sf::Event::KeyReleased: case sf::Event::KeyReleased:
m_actions.push_back(kb.getReleasedAction(event.key.code)); action = kb.getReleasedAction(event.key.code);
if(action != -1)
m_actions.push_back(action);
releaseHeldKeys(event.key.code); releaseHeldKeys(event.key.code);
break; break;
case sf::Event::MouseButtonPressed: 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)); m_heldkeys.push_back((sf::Keyboard::Key) (sf::Keyboard::KeyCount + event.mouseButton.button));
break; break;
case sf::Event::MouseButtonReleased: 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)); releaseHeldKeys((sf::Keyboard::Key) (sf::Keyboard::KeyCount + event.mouseButton.button));
break; break;
case sf::Event::MouseWheelScrolled: case sf::Event::MouseWheelScrolled:
if (event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel) if (event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel)
m_delta_vertical_scroll = event.mouseWheelScroll.delta; m_delta_vertical_scroll = event.mouseWheelScroll.delta;
break; break;
case sf::Event::MouseMoved: case sf::Event::MouseMoved:
m_mouse_position = sf::Mouse::getPosition(); m_mouse_position = sf::Mouse::getPosition(*m_window);
break; break;
case sf::Event::MouseEntered: case sf::Event::MouseEntered:
// action MouseEntered // action MouseEntered
@ -80,9 +95,13 @@ void Input::updateEvents(){
break; break;
case sf::Event::Resized: case sf::Event::Resized:
m_hasBeenResized = true; m_hasBeenResized = true;
if(m_mouseGrabbed)
m_last_mouse_position = sf::Vector2i(m_window->getSize())/2;
break; break;
} }
} }
if(m_mouseGrabbed)
sf::Mouse::setPosition(m_last_mouse_position, *m_window);
for (auto key: m_heldkeys) for (auto key: m_heldkeys)
{ {
m_actions.push_back(kb.getHoldAction(key)); m_actions.push_back(kb.getHoldAction(key));
@ -155,6 +174,13 @@ float Input::getDeltaVerticalScroll() const
return m_delta_vertical_scroll; 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 Input::getText()
{ {
std::string t = m_buffer; std::string t = m_buffer;

View File

@ -35,6 +35,7 @@ private:
sf::Vector2i m_mouse_position; sf::Vector2i m_mouse_position;
sf::Vector2i m_last_mouse_position; sf::Vector2i m_last_mouse_position;
float m_delta_vertical_scroll; float m_delta_vertical_scroll;
bool m_mouseGrabbed;
/* text-related variable */ /* text-related variable */
std::string m_buffer; std::string m_buffer;
@ -65,6 +66,11 @@ public:
sf::Vector2i getDeltaPosition() const; sf::Vector2i getDeltaPosition() const;
float getDeltaVerticalScroll() const; float getDeltaVerticalScroll() const;
/* Mouse grabbing */
void setMouseGrabbed(bool isGrabbed);
void toggleMouseGrab() { setMouseGrabbed(!m_mouseGrabbed); }
bool isMouseGrabbed() const { return m_mouseGrabbed; }
/* text-related function */ /* text-related function */
std::string getText(); std::string getText();

View File

@ -31,6 +31,7 @@ std::vector<Binding> IKeysMap::getBindings(int action) const {
KeyBindings::KeyBindings() KeyBindings::KeyBindings()
{ {
} }
KeyBindings::KeyBindings(const Context &context, const IKeysMap &keysmap) KeyBindings::KeyBindings(const Context &context, const IKeysMap &keysmap)
{ {
for (int action : context.getActions()){ for (int action : context.getActions()){