Обновление: Вот библиотека, которую я написал для обработки ввода с клавиатуры. Он использует лицензию FreeBSD. Я даже пометил его как v1.0
, поэтому я считаю его "качеством выпуска".
https://github.com/depp/keycode
В последнее время я очень усердно работал над тем, чтобы получить «правильное» решение для игр, и я еще не закончил. Я поделюсь тем, что знаю.
Коды ключей
Для игр коды клавиш - это обычно то, что вы хотите.
Когда вы нажимаете клавишу на клавиатуре, ОС сначала переводит нажатие кнопки в код клавиши. Код клавиши указывает физическое расположение клавиши на клавиатуре. Например, код 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.
Конечно, было бы слишком легко, если бы код ключа был одинаковым на разных платформах. Вы можете использовать код ключа, специфичный для платформы, или перевести его в независимое от платформы значение. Я предлагаю использовать коды HID USB ( pdf ) в качестве независимых от платформы кодов, поскольку ряд умных людей уже столкнулся с проблемой согласования того, как называть каждую клавишу.
В библиотеке, которую я разместил выше, есть таблицы для каждой платформы, такие как WIN_NATIVE_TO_HID
для перевода кодов ключей в коды HID USB.
Сложнее всего сообщить пользователю, какую кнопку следует нажать, но по крайней мере люди из других стран могут играть в вашу игру.
Коды символов
Вы не хотите использовать коды символов, даже если их проще использовать, если вы живете в США, а ваша аудитория также живет в США.
После перевода нажатия кнопки в код клавиши ОС затем переводит код клавиши в код символа . Код символа зависит от текущей раскладки клавиатуры, а также часто зависит от клавиш-модификаторов.
Поэтому, если вы нажмете A на клавиатуре, вы получите коды клавиш 65, 4 или 38, в зависимости от того, на какой платформе вы находитесь. Но вы получите код символа 'a'
или 'A'
в зависимости от того, нажата ли клавиша Shift, или вы можете получить 'Q'
, если раскладка клавиатуры установлена на французском языке, или 'Ф'
, если раскладка клавиатуры установлена. на русский. Таким образом, если вы вводите код WASD в свою игру и используете коды символов, ввод будет полностью нарушен, когда кто-то из другой страны будет играть в вашу игру. Вы должны будете использовать ZQSD во Франции, ЦФЫВ в России, и очень скоро у вас болит голова.
Я сам использую раскладку не-QWERTY (Дворак), и большинство игр полностью сломаны.Вместо клавиши W стоит , , которая становится <</kbd>, если вы нажимаете клавишу Shift, и некоторые игры не распознают это как то же самое.ключ.Например, я бы нажал , , чтобы двигаться вперед, но если бы я отпустил кнопку, когда клавиша Shift была нажата, игра подумала бы, что я выпустил <</kbd>, и подумал бычто , все еще не работает, поэтому я продолжал двигаться вперед.Большинство игр, использующих SDL, для меня не работают на Mac, даже если я переключаюсь на раскладку клавиатуры США (я думаю, что это ошибка в SDL).
LibSDL
SDL 2.0 обеспечивает платформукоды независимых ключей, называемые коды сканирования .Используйте заголовок "SDL_scancode.h"
.Разработчики SDL пришли к тому же выводу, что коды сканирования должны быть переведены обратно в коды HID USB, поэтому коды сканирования SDL полностью совместимы с библиотекой, которую я разместил выше (см. keycode.h и SDL_scancode.h , числовые значения идентичны).
По этой и другим причинам, если вы используете SDL 1.2, я настоятельно рекомендую обновить его до 2.0.