mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-06 17:41:04 +00:00
Replace MyEventReceiver KeyList with std::unordered_set (#10419)
This commit is contained in:
parent
34e3ede8ee
commit
787561b29a
3 changed files with 64 additions and 111 deletions
|
@ -21,9 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
|
||||
#include "irrlichttypes_extrabloated.h"
|
||||
#include "joystick_controller.h"
|
||||
#include <list>
|
||||
#include "keycode.h"
|
||||
#include "renderingengine.h"
|
||||
#include <unordered_set>
|
||||
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
#include "gui/touchscreengui.h"
|
||||
|
@ -61,98 +61,32 @@ struct KeyCache
|
|||
InputHandler *handler;
|
||||
};
|
||||
|
||||
class KeyList : private std::list<KeyPress>
|
||||
{
|
||||
typedef std::list<KeyPress> super;
|
||||
typedef super::iterator iterator;
|
||||
typedef super::const_iterator const_iterator;
|
||||
|
||||
virtual const_iterator find(const KeyPress &key) const
|
||||
{
|
||||
const_iterator f(begin());
|
||||
const_iterator e(end());
|
||||
|
||||
while (f != e) {
|
||||
if (*f == key)
|
||||
return f;
|
||||
|
||||
++f;
|
||||
}
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
virtual iterator find(const KeyPress &key)
|
||||
{
|
||||
iterator f(begin());
|
||||
iterator e(end());
|
||||
|
||||
while (f != e) {
|
||||
if (*f == key)
|
||||
return f;
|
||||
|
||||
++f;
|
||||
}
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
public:
|
||||
void clear() { super::clear(); }
|
||||
|
||||
void set(const KeyPress &key)
|
||||
{
|
||||
if (find(key) == end())
|
||||
push_back(key);
|
||||
}
|
||||
|
||||
void unset(const KeyPress &key)
|
||||
{
|
||||
iterator p(find(key));
|
||||
|
||||
if (p != end())
|
||||
erase(p);
|
||||
}
|
||||
|
||||
void toggle(const KeyPress &key)
|
||||
{
|
||||
iterator p(this->find(key));
|
||||
|
||||
if (p != end())
|
||||
erase(p);
|
||||
else
|
||||
push_back(key);
|
||||
}
|
||||
|
||||
bool operator[](const KeyPress &key) const { return find(key) != end(); }
|
||||
};
|
||||
|
||||
class MyEventReceiver : public IEventReceiver
|
||||
{
|
||||
public:
|
||||
// This is the one method that we have to implement
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
|
||||
bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown[keyCode]; }
|
||||
bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown.count(keyCode); }
|
||||
|
||||
// Checks whether a key was down and resets the state
|
||||
bool WasKeyDown(const KeyPress &keyCode)
|
||||
{
|
||||
bool b = keyWasDown[keyCode];
|
||||
bool b = keyWasDown.count(keyCode);
|
||||
if (b)
|
||||
keyWasDown.unset(keyCode);
|
||||
keyWasDown.erase(keyCode);
|
||||
return b;
|
||||
}
|
||||
|
||||
// Checks whether a key was just pressed. State will be cleared
|
||||
// in the subsequent iteration of Game::processPlayerInteraction
|
||||
bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed[keycode]; }
|
||||
bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed.count(keycode); }
|
||||
|
||||
// Checks whether a key was just released. State will be cleared
|
||||
// in the subsequent iteration of Game::processPlayerInteraction
|
||||
bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased[keycode]; }
|
||||
bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased.count(keycode); }
|
||||
|
||||
void listenForKey(const KeyPress &keyCode) { keysListenedFor.set(keyCode); }
|
||||
void listenForKey(const KeyPress &keyCode) { keysListenedFor.insert(keyCode); }
|
||||
void dontListenForKeys() { keysListenedFor.clear(); }
|
||||
|
||||
s32 getMouseWheel()
|
||||
|
@ -198,24 +132,20 @@ public:
|
|||
#endif
|
||||
|
||||
private:
|
||||
// The current state of keys
|
||||
KeyList keyIsDown;
|
||||
//! The current state of keys
|
||||
std::unordered_set<KeyPress> keyIsDown;
|
||||
|
||||
// Whether a key was down
|
||||
KeyList keyWasDown;
|
||||
//! Whether a key was down
|
||||
std::unordered_set<KeyPress> keyWasDown;
|
||||
|
||||
// Whether a key has just been pressed
|
||||
KeyList keyWasPressed;
|
||||
//! Whether a key has just been pressed
|
||||
std::unordered_set<KeyPress> keyWasPressed;
|
||||
|
||||
// Whether a key has just been released
|
||||
KeyList keyWasReleased;
|
||||
//! Whether a key has just been released
|
||||
std::unordered_set<KeyPress> keyWasReleased;
|
||||
|
||||
// List of keys we listen for
|
||||
// TODO perhaps the type of this is not really
|
||||
// performant as KeyList is designed for few but
|
||||
// often changing keys, and keysListenedFor is expected
|
||||
// to change seldomly but contain lots of keys.
|
||||
KeyList keysListenedFor;
|
||||
//! List of keys we listen for
|
||||
std::unordered_set<KeyPress> keysListenedFor;
|
||||
};
|
||||
|
||||
class InputHandler
|
||||
|
@ -347,7 +277,7 @@ public:
|
|||
return true;
|
||||
}
|
||||
|
||||
virtual bool isKeyDown(GameKeyType k) { return keydown[keycache.key[k]]; }
|
||||
virtual bool isKeyDown(GameKeyType k) { return keydown.count(keycache.key[k]); }
|
||||
virtual bool wasKeyDown(GameKeyType k) { return false; }
|
||||
virtual bool wasKeyPressed(GameKeyType k) { return false; }
|
||||
virtual bool wasKeyReleased(GameKeyType k) { return false; }
|
||||
|
@ -362,7 +292,7 @@ public:
|
|||
s32 Rand(s32 min, s32 max);
|
||||
|
||||
private:
|
||||
KeyList keydown;
|
||||
std::unordered_set<KeyPress> keydown;
|
||||
v2s32 mousepos;
|
||||
v2s32 mousespeed;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue