GLUT не определяет должным образом более двух нажатых клавиш? - PullRequest
4 голосов
/ 23 июля 2011

Я пытаюсь сделать маленькую игру, используя (бесплатно) GLUT.Я знаю, что он старый и есть лучшие альтернативы, но в настоящее время я предпочитаю придерживаться его и использовать его как можно больше.Я программирую на C.

В настоящее время я пытаюсь заставить GLUT правильно определять все нажатия клавиш.Я использую glutKeyboardFunc, glutKeyboardUpFunc, glutSpecialFunc и glutSpecialUpFunc для обнаружения нажатых клавиш и сохраняю их состояние в созданном мною коротком массиве (в настоящее время у меня есть только 5 используемых клавиш, поэтому я просто создал для них определенный массив).

Тем не менее, хотя все работает нормально для 2 клавиш или меньше, игра не может правильно определить 3 клавиши или больше.В то время как для некоторых клавиш он правильно определяет комбинацию (что на самом деле происходит только для 1 конкретной комбинации), для других функции просто не обнаруживают третью нажатую клавишу.

Я проверял свой код несколько раз,и нет ничего особенного в комбинации, которая работает.Я также заставил glutKeyboardFunc и glutSpecialFunc напрямую печатать каждое нажатие клавиш, которое они получают, и кажется, что они просто перестают работать после того, как я нажимаю более 2 клавиш.

Это известная проблема с GLUT или что-то еще?Я много гуглил и не нашел никого с подобной проблемой.

Ответы [ 2 ]

4 голосов
/ 23 июля 2011

Мне не очень нравится GLUT, но, как я знаю, но вы должны убедиться, что ваша клавиатура поддерживает более 2 клавиш ввода одновременно.Эта функция называется n-key rollover . На этой странице написано, что одновременное нажатие двух клавиш может быть общим значением для некоторых клавиатур, но вам не нужно доверять этому источнику.

1 голос
/ 23 июля 2011

Я поясню один момент: glutKeyBoardFunc является обратным вызовом, т. Е. Он вызывается для каждой клавиши, нажатой и повторяющейся снова и снова, и все операторы if-else (или switch-case) для различных комбинаций клавиш казнены. Это означает следующее: если вы нажмете «A», «->» (стрелка вправо) и «D» одновременно, в зависимости от того, какое событие нажатия клавиши было получено первым, обратный вызов будет выполнен соответствующим образом. Иногда с задержкой, а иногда и анимация на экране может на мгновение остановиться.

GLUT предназначен исключительно для образовательных / учебных целей, но не подходит для полноценных приложений, поскольку он не предназначен для этого. Вы используете специальные библиотеки ОС или другие языки (например, Qt) для встраивания в них «окна» OpenGL и выполнения событий клавиатуры и т. Д. Обработка событий в этих (и / или специфичных для ОС средах) радикально отличается (и лучше) ) чем глют.

Возможно, вы захотите свести количество одновременных нажатий к минимуму. Вы можете увеличить его с помощью мыши, чтобы избавиться от резкого ответа / обработки ...

...