Ответ 1
Обновление: Вот библиотека, которую я написал для обработки ввода с клавиатуры. Он использует лицензию FreeBSD. Я даже отметил его как v1.0
, поэтому считаю, что это "качество выпуска".
https://github.com/depp/keycode
Недавно я очень много работал, чтобы получить это "просто право" для игр, и я еще не закончил. Я расскажу то, что знаю.
Коды клавиш
Для игр коды клавиш обычно вам нужны.
Когда вы нажимаете клавишу на клавиатуре, ОС сначала переводит кнопку нажатием на key code. key code указывает физическое местоположение ключа на клавиатуре. Например, код 4 может соответствовать знаку A на клавиатуре США (даже если у этого ключа есть другой ярлык во Франции или России). Каждая платформа имеет другой набор кодов клавиш или, возможно, несколько наборов. Вы можете узнать их под другим именем, например, коды сканирования или коды виртуальных клавиш.
-
Windows использует коды виртуальных ключей (документация MSDN). Они стабильны в различных конфигурациях оборудования и программного обеспечения. Вы можете найти определения в заголовочном файле
<Winuser.h>
. В Windows, если вы нажмете левую верхнюю клавишу строки дома (A в США, Q во Франции), вы получите код 65. -
Mac OS X имеет коды клавиш, которые были стабильными с 80-х годов. Они определены в
<Carbon/Events.h>
. Вам действительно не нужно ссылаться на Carbon, чтобы использовать коды клавиш, но вам нужен заголовок. В OS X, если вы нажмете левую верхнюю клавишу строки дома, вы получите код 4. -
Linux имеет несколько расходящихся наборов ключей. Итак, на Linux у вас есть несколько вариантов. Вы можете использовать ключевые сим (которые имеют недостатки, которые я объясню ниже), вы можете предположить, что пользователь использует специальный драйвер ввода (в наши дни Evdev - очень хорошее предположение), или вы можете каким-то образом выяснить, какой драйвер ввода машина использует. Чтобы получить коды ключей, вы должны прочитать файлы определения клавиатуры. Например, посмотрите на
/usr/share/X11/xkb/keycodes/evdev
для кодов ключей Evdev. С помощью Evdev, если вы нажмете левую верхнюю клавишу строки дома, вы получите код 38.
Конечно, было бы слишком легко, если бы key code были одинаковыми на разных платформах. Вы можете использовать платформу key code или перевести ее в независимое от платформы значение. Я предлагаю использовать коды USB HID (pdf) в качестве независящих от платформы кодов, поскольку ряд умных людей уже столкнулся с проблемой согласия на что нужно называть каждый ключ.
В библиотеке, которую я разместил выше, есть таблицы для каждой платформы, такие как WIN_NATIVE_TO_HID
для перевода кодов клавиш в коды USB HID.
Жесткая часть - это общение с пользователем, какую кнопку они должны нажать, но по крайней мере люди из других стран могут играть в вашу игру.
Коды символов
Вы не хотите использовать коды символов, даже если их проще использовать, если вы живете в США, а ваша аудитория также живет в США.
После перевода кнопки нажмите key code, затем OS переводит key code в код символа. На код символа влияет текущая раскладка клавиатуры и часто на нее влияют также ключи-модификаторы.
Итак, если вы нажмете A на клавиатуре, вы получите коды клавиш 65, 4 или 38, в зависимости от того, на какой платформе вы находитесь. Но вы получите код символа 'a'
или 'a'
в зависимости от того, нажата ли клавиша сдвига, или вы можете получить 'Q'
, если раскладка клавиатуры установлена на французский язык или 'Ф'
, если установлена раскладка клавиатуры на русский. Итак, если вы кодируете WASD в свою игру и используете коды символов, вход будет полностью нарушен, когда кто-то из другой страны будет играть в вашу игру. Вам нужно будет использовать ZQSD во Франции, ЦФЫВ в России, и довольно скоро у вас болит голова.
Я сам использую не-QWERTY-макет (Dvorak), и большинство игр полностью сломаны. Вместо ключа W находится ,, который становится <, если у вас есть клавиша shift, а некоторые игры не распознают это как один и тот же ключ. Например, я бы нажал ,, чтобы двигаться вперед, но если бы я отпустил кнопку, когда клавиша смены была опущена, игра подумала бы, что я выпустил < и думаю, что ,, поэтому я буду продолжать двигаться вперед. Большинство игр, использующих SDL, разбиты на Mac для меня, даже если я переключусь на раскладку клавиатуры в США (я думаю, что это сбой в SDL).
LibSDL
SDL 2.0 предоставляет не зависящие от платформы коды ключей, называемые кодами сканирования. Используйте заголовок "SDL_scancode.h"
. Разработчики SDL пришли к тому же выводу, что коды сканирования должны быть переведены обратно на коды USB HID, поэтому коды сканирования SDL полностью совместимы с библиотекой, которую я опубликовал выше (см. keycode.h и SDL_scancode.h, числовые значения идентичны).
По этой и другим причинам, если вы используете SDL 1.2, я настоятельно рекомендую обновить до 2.0.