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