Я пытаюсь реализовать лучшее обнаружение состояния ключа в классе-оболочке для окна GLFW.Мне нужно было убедиться, что если бы мое состояние клавиши постоянно задавалось как нажатое, определенные действия не запускались бы повторно.Таким образом, я заключил в себе идею триггеров подъема, опускания, пола и потолка.Проблема в том, что мне не обязательно нужны все триггеры для всех скомпилированных частей кода.поэтому я пришел к следующему решению:
class Window{
public:
GLFWwindow *m_window_ptr = nullptr;
//...
bool isKeyPressed(int key) const{
return glfwGetKey(m_window_ptr, key) == GLFW_PRESS;
}
bool isKeyReleased(int key) const{
return glfwGetKey(m_window_ptr, key) == GLFW_RELEASE;
}
enum class KeyState {
pressed,
released
};
enum class SignalEdge {
rising,
falling,
floor,
ceiling,
};
template<int key_t>
SignalEdge getKeyState() {
static KeyState last_key_state = KeyState::released;
switch (last_key_state) {
case KeyState::released:
if (isKeyPressed(key_t)) {
last_key_state = KeyState::pressed;
return SignalEdge::rising;
} else {
return SignalEdge::floor;
}
break;
case KeyState::pressed:
if (isKeyReleased(key_t)) {
last_key_state = KeyState::released;
return SignalEdge::falling;
} else {
return SignalEdge::ceiling;
}
break;
}
}
template<int key_t>
bool isKeyRisingEdge() {
return getKeyState<key_t>() == SignalEdge::rising;
}
};
Только чтобы понять, что мне понадобится это для каждого оконного объекта , поэтому статические переменные внутри каждого экземпляра шаблона getKeyState будут применяться к каждому окнув GLFW.
Мой единственный способ избежать этого - использовать переменные-члены для каждого типа шаблона ключа, но я не хочу тратить усилия на отображение каждого типа ключа в моем классе, просто чтобы установить переменную состояния для каждого из них.,Я хотел бы автоматически сопоставить переменные для каждого объекта с существованием данной шаблонной функции, то есть именно то, что я настроил здесь, но где состояние сохраняется для объекта окна GLFW.
Если я исключу ручное сопоставление целочисленных значений GLFW, я не уверен, что смогу сделать, я подумал о шаблонах переменных , но я и не вижу пути вперед в этом (как бы я имел переменную существовать только при создании экземпляра функции?).Единственный другой вариант, который я вижу, - это сохранение динамически размещенного массива состояний как статической переменной функции-члена, внутреннее сохранение увеличенного индекса для каждого объекта окна, используемого для индексации в массиве статических переменных, или выполнение противоположного действия сфункции, но это кажется грязным?Есть ли другой способ сделать это во время компиляции с помощью шаблонов?