Есть ли способ определить, когда клавиша нажата только один раз? (не удерживается)

#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;