#c
Вопрос:
Я искал способы определить, когда клавиша была нажата, но только один раз, но единственное, что я могу найти, — это GetAsyncKeyState и GetKeyState. Я создаю ритмическую игру для развлечения, и я использую утверждение while(true), чтобы все сделать. Есть ли в любом случае способ определить, когда клавиша нажата один раз? (Я также использую GLFW, если это поможет)
Комментарии:
1. Поскольку вы упомянули
GetAsyncKeyState
, что пишете программу для Windows?2. Если бы вы создавали приложение с графическим интерфейсом, вы могли бы обрабатывать
WM_KEY(DOWN|UP)
сообщения, которые содержат количество повторений, на которые вы можете посмотреть. Но в консольном приложении вы не получаете эту информацию отGet(Async)KeyState()
. Но вы можете отSetWindowsHookEx(WH_KEYBOARD)
. В противном случае просто создайте конечный автомат и обновляйте его всякийGet(Async)KeyState()
раз, когда сообщаете о состоянии, отличном от того, что находится в вашем конечном автомате.
Ответ №1:
Вы могли бы сохранить состояние предыдущих нажатий клавиш, если бы оно не было нажато в последнем кадре и находится сейчас, это означало бы, что клавиша удерживается нажатой.
Вот пример с LMB:
bool previousMouseState = false; if (GetKeyState(VK_LBUTTON) lt; 0) { if (!prevMouseState) { previousMouseState = true; //Mouse clicked. } } else previousMouseState = false;