Элегантный способ хранения ввода с клавиатуры - PullRequest
0 голосов
/ 26 апреля 2019

В настоящее время я пишу приложение, которое использует библиотеку 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.Я ищу динамическое решение, в котором мне нужно только изменить мое перечисление, если я хочу добавить или удалить отслеживаемые кнопки.

Я хочу использовать структуру вместо одного bool для состояний, потому что это очень похоже наполучить дополнительные свойства в будущем.

...