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) :
m_window(w),
m_closeRequested(false)
m_closeRequested(false),
m_mouseGrabbed(false)
{
m_heldkeys = std::vector<sf::Keyboard::Key>();
m_actions = std::vector<int>();
@ -31,12 +32,18 @@ void Input::updateEvents(){
m_closeRequested = false;
m_hasBeenResized = false;
m_delta_vertical_scroll = 0;
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))
{
@ -50,19 +57,27 @@ void Input::updateEvents(){
m_buffer.push_back(c);
break;
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);
break;
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);
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:
@ -70,7 +85,7 @@ void Input::updateEvents(){
m_delta_vertical_scroll = event.mouseWheelScroll.delta;
break;
case sf::Event::MouseMoved:
m_mouse_position = sf::Mouse::getPosition();
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;

View File

@ -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();

View File

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