优雅的键盘输入存储方式

时间:2019-04-26 14:05:02

标签: c++ glfw

我目前正在编写一个使用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访问状态。 我正在寻找一种动态解决方案,只需在我想添加或删除跟踪按钮的情况下更改枚举即可。

我想为州使用一个结构而不是一个布尔值,因为将来很可能获得额外的属性。

0 个答案:

没有答案