1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-06 17:41:04 +00:00

Revert "Replace MyEventReceiver KeyList with std::unordered_set" (#10622)

This reverts commit 787561b29a.
This commit is contained in:
SmallJoker 2020-11-12 19:16:02 +01:00 committed by GitHub
parent adffef2b94
commit 68139a28eb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 111 additions and 64 deletions

View file

@ -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,32 +61,98 @@ 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.count(keyCode); }
bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown[keyCode]; }
// Checks whether a key was down and resets the state
bool WasKeyDown(const KeyPress &keyCode)
{
bool b = keyWasDown.count(keyCode);
bool b = keyWasDown[keyCode];
if (b)
keyWasDown.erase(keyCode);
keyWasDown.unset(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.count(keycode); }
bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed[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.count(keycode); }
bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased[keycode]; }
void listenForKey(const KeyPress &keyCode) { keysListenedFor.insert(keyCode); }
void listenForKey(const KeyPress &keyCode) { keysListenedFor.set(keyCode); }
void dontListenForKeys() { keysListenedFor.clear(); }
s32 getMouseWheel()
@ -132,20 +198,24 @@ public:
#endif
private:
//! The current state of keys
std::unordered_set<KeyPress> keyIsDown;
// The current state of keys
KeyList keyIsDown;
//! Whether a key was down
std::unordered_set<KeyPress> keyWasDown;
// Whether a key was down
KeyList keyWasDown;
//! Whether a key has just been pressed
std::unordered_set<KeyPress> keyWasPressed;
// Whether a key has just been pressed
KeyList keyWasPressed;
//! Whether a key has just been released
std::unordered_set<KeyPress> keyWasReleased;
// Whether a key has just been released
KeyList keyWasReleased;
//! List of keys we listen for
std::unordered_set<KeyPress> keysListenedFor;
// 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;
};
class InputHandler
@ -277,7 +347,7 @@ public:
return true;
}
virtual bool isKeyDown(GameKeyType k) { return keydown.count(keycache.key[k]); }
virtual bool isKeyDown(GameKeyType k) { return keydown[keycache.key[k]]; }
virtual bool wasKeyDown(GameKeyType k) { return false; }
virtual bool wasKeyPressed(GameKeyType k) { return false; }
virtual bool wasKeyReleased(GameKeyType k) { return false; }
@ -292,7 +362,7 @@ public:
s32 Rand(s32 min, s32 max);
private:
std::unordered_set<KeyPress> keydown;
KeyList keydown;
v2s32 mousepos;
v2s32 mousespeed;
};