Используя OpenGL/GLUT, как бы я обнаружил, что одновременно удерживаются две клавиши?

Используя OpenGL/GLUT, как бы я обнаружил, что одновременно удерживаются две клавиши, например "a" и "j"?

(Эта программа должна компилироваться с помощью OSX GCC, Windows GCC, Windows VS2005, поэтому никаких зависимых от ОС хаков пожалуйста.)

Ответ 1

Попробуйте следующее:

  • Используйте glutIgnoreKeyRepeat, чтобы получать только физические события keydown/keyup
  • Используйте glutKeyboardFunc, чтобы зарегистрировать обратный вызов, прослушивающий события блокировки.
  • Используйте glutKeyboardUpFunc для регистрации обратного вызова при прослушивании событий keyup.
  • Создайте массив bool keystates[256], чтобы сохранить состояние клавиш клавиатуры.
  • При получении события через обратный вызов keydown установите keystates[key] = true.
  • При получении события через ваш обратный вызов с помощью клавиатуры установите keystates[key] = false.
  • В вашем цикле выполнения проверьте, если (keystates['a'] || keystates['A']) && (keystates['j'] || keystates['J']).

Посмотрите в этом направлении. Хотя я не тестировал его, он должен работать. Вам также могут понадобиться glutSpecialFunc и glutSpecialUpFunc для получения сообщений для специальных клавиш.

Кроме того, имейте в виду, что GLUT - это действительно старый материал и что есть намного более приятные альтернативы.

Ответ 2

с помощью "более приятной альтернативы", если вы имеете в виду более простую и независимую от избыточного значения входную функцию, затем получили функцию GetAsyncKeyState...

MSDN - функция GetAsyncKeyState