我目前正在编写一个使用glfw库进行窗口处理的应用程序。我需要从我的应用程序的所有位置访问某些键盘按钮的状态,但是我真的不想公开将glfw窗口处理的内容提供给所有内容。通过实际通过glfw检查键盘来检查按钮是否被按下似乎是一个次优的想法。目前,我收到通过回调函数按下或释放按钮时的事件。我现在想将该信息存储在输入类中。
struct KeyState
{
bool isPressed = false;
};
enum class KeyType
{
KEY_1,
KEY_2,
KEY_3,
// ...
};
class Input
{
public:
static bool IsKeyDown(KeyType key);
};
我希望能够从我的应用程序周围发出这样的呼叫:
Input::IsKeyDown(KEY_1)
并通过类似于以下内容的我的glfw回调函数设置状态:
Input::PressKey(KEY_1)
Input::ReleaseKey(KEY_1)
我的问题是如何存储实际状态。 我尝试为此使用一个KeyState数组,但是有多个问题。与枚举中的元素具有相同大小的数组,然后以某种方式使用枚举值作为指示。但是,不能保证枚举值包含有效的数组索引,因为它可以手动将值分配给枚举元素。这也意味着对数组大小进行硬编码,这在以后要向枚举添加/删除元素时很烦人。
对整个数组进行硬编码也是我要避免的事情,因为那将意味着两次定义每个按钮,并将其与枚举链接。我还希望避免涉及遍历所有按钮状态的方法,我希望能够直接基于KeyType访问状态。 我正在寻找一种动态解决方案,只需在我想添加或删除跟踪按钮的情况下更改枚举即可。
我想为州使用一个结构而不是一个布尔值,因为将来很可能获得额外的属性。