#c #input #keyboard
#c #ввод #клавиатура
Вопрос:
Недавно я создал небольшое приложение, используя OpenGL и ПЕРЕНАСЫЩЕНИЕ через C . Все работало отлично, а затем я внедрил надлежащий игровой цикл с частотой кадров и тому подобным, И это многое улучшило, однако, похоже, это также нарушило обычное обнаружение перенасыщения клавиатуры (что никогда не казалось отличным для ввода с игровой клавиатуры) — так что теперь я ищу другой методввод с клавиатуры в моем приложении.
Может ли кто-нибудь предложить какие-либо другие (желательно относительно простые) методы обнаружения ввода клавиш в приложении?
Комментарии:
1. Если вы используете встроенный API ОС, нам нужно знать, какую ОС вы используете (Windows, я полагаю?) В противном случае вы могли бы попробовать другую облегченную библиотеку, такую как GLFW.
2. Не то, чтобы мне нравился перенасыщение, но почему вы говорите, что ввод с клавиатуры перенасыщения плох? Существует два режима ввода с клавиатуры с перенасыщением. Один из них похож на текстовые редакторы, когда, если вы продолжаете нажимать клавишу, вы будете периодически получать ее. Другой метод (который используется в играх) — уведомлять вас о нажатии клавиши (чтобы вы изменили состояние игры) и о ее отпускании (чтобы вы изменили состояние обратно). Второй метод отлично работает с играми. Кстати, второй метод также работает с SDL. Я написал много игр с его помощью, и все они отлично работают.
3. @Shahbaz, извините за упоминание старого комментария и сообщения, но у freeglut даже есть несколько ошибок, которые не устранялись годами, например, когда нажатие ctrl number даже не запускает обратный вызов Keyborad, без специального обратного вызова клавиатуры. Вы не можете различить ctrl-break и ctrl -c, потому что они отображаются как один и тот же символ ascii … Обработка клавиатуры в перенасыщении плохая. Есть и другие ошибки, и это только в Windows … sourceforge.net/p/freeglut/bugs
Ответ №1:
итак, теперь я ищу достойный метод ввода с клавиатуры в моем приложении.
Нет, вы больше не хотите использовать перенасыщение.
По крайней мере, в Windows ваша способность получать входные данные напрямую связана с вашим окном. Если у вас нет какого-либо окна, у вас нет ввода (консоль сама по себе является окном). И что еще более важно, если GLUT владеет вашим окном, то GLUT решает, как обрабатывается ввод из этого окна.
Поэтому, если вы используете GLUT, вы должны использовать систему ввода GLUT. И если система ввода GLUT недостаточно хороша для ваших нужд, тогда пришло время отказаться от перенасыщения ради более зеленых пастбищ. В конце концов, ПЕРЕНАСЫЩЕНИЕ предназначено для демонстраций, а не для серьезных приложений.
Итак, вам нужна замена для всего, что делает для вас ПЕРЕНАСЫЩЕНИЕ. Возможно, вам удастся избежать GLFW, но этого может быть недостаточно для вашей игры. Таким образом, SDL, SFML и Allegro 5 — это все возможности. У них есть способы создания окон, использующих OpenGL, и все они являются кроссплатформенными. Все они имеют более эффективные и гибкие системы ввода, чем ПЕРЕНАСЫЩЕНИЕ.
Комментарии:
1. Я думаю, что я переключусь с перенасыщения на SDL, а затем надеюсь, что это будет так же просто, как изменить несколько строк после включения SDL.h
Ответ №2:
Простого способа нет. Вам нужно отслеживать сообщения Windows, если вы хотите вводить данные из ОС, а этого не произойдет, если вы используете ПЕРЕНАСЫЩЕНИЕ, потому что оно создает окно для вас. Также еще одна плохая особенность GLUT заключается в том, что он на самом деле отслеживает не нажатые клавиши, а введенные символы, поэтому нажатие num1 и num1 shift генерирует 2 разные вещи, и для каждой раскладки клавиатуры они будут разными. Если вы хотите правильно работать с клавиатурой, используйте SDL или лучший SFML (google for it — простая и быстрая мультимедийная библиотека). Это позволяет отслеживать нажатия клавиш. Или, если вы не хотите использовать для этого какую-либо библиотеку, вам нужно создать и обработать window для себя, и он не будет переносимым, если вы не создадите этот код для каждой платформы. Даже если вы не хотите переносимости, программирование с помощью win32 — это боль в заднице, и вы, конечно же, не хотите этого делать.
Перенасыщение просто не предназначено для игр, в нем больше ничего нет, и мой совет — использовать SFML.
Обновление: если вы действительно хотите возиться с win32 (в случае ОС Windows), предполагая, что вы знаете, как создавать и обрабатывать ваше окно, сообщение, которое Windows отправляет в window, — WM_KEYDOWN, а идентификатор нажатой клавиши сохраняется как wParam . Здесь вы можете найти все возможные значения виртуальных кодов клавиш.
Ответ №3:
Есть OIS. У людей-людоедов есть некоторая документация.