2014-12-17 1 views
1

У меня есть двигатель под названием Ergame, который имеет модуль под названием erfunc. Я написал его на платформе NT/Windows, и теперь я на POSIX/Linux. Поскольку я считаю, что ввод в pygame значительно затеняет много раз, и я хотел создать четкое различие между раскладками клавиатуры IBM-STANDARD-US-PC и ABNT2, I've created several constants whose values are pygame-keycodes. У меня есть проблема.Почему ключи для ключей pygame являются os-specific?

Например, код ключа для «ОСТРОЕ/ТИЛД» на стандартном стандарте США - 96. Я проверил много раз. Теперь, на POSIX, когда я проверяю, я получаю 39 (И то же самое относится ко всем остальным). Что в основном означает: если я ссылаюсь на имя pygame, например pygame.K_UP, что угодно. Но если я напрямую ссылаюсь на коды ключей, они различаются в зависимости от ОС (что в основном означает, что мне нужно будет обнаружить ОС на моем двигателе и определить константы соответственно. Довольно скучно.)

Во всяком случае, мне стало любопытно , Зачем?

+0

Если имена pygame работают, почему бы вам просто не использовать их? – BrenBarn

ответ

1

Позвольте мне предисловие к этому, сказав, что у меня нет опыта ввода данных в системах Windows или Mac, но вот что происходит на стороне Linux.

Основные события обычно следуют трехэтапной обработке перед достижением программы. Клавиатура генерирует сканкод. ОС преобразует scancode в код ключа. Карта клавиатуры преобразует код ключа в символ.

  • сканкодов аппаратно специфичны и представляют расположение на клавиатуре
  • Кодовых ключами являются значением карты OS в сканкоды, как правило, определенная в /usr/include/linux/input.h
  • символов клавиш символы, отображенная на коды клавиш, определяемых вашей раскладка. Вы можете проверить их с xmodmap -pke

Для SDL (который PyGame выступает в качестве обертки вокруг), скан/скан различие немного нечеткой, и не очень важно. То, что он сообщает как «scancode», на самом деле является ключевым кодом, вы заметите, что 0gg event.scancode pygame будет соответствовать значению «keycode», напечатанному в xev. Что SDL называет «sym», pygame называет «ключ» и действительно является ключевым кодом SDL. Клавиши представляют значение «unicode» события.

Важной частью этого является то, что вы на самом деле не получаете исходный scancode, поэтому можно ожидать, что он зависит от ОС, а не зависит от клавиатуры. Кроме того, если вы получаете исходный scancode, вы ожидаете, что scancodes будут эквивалентны положению, а не персонажу. Таким образом, все клавиши-1 col-1 производят один и тот же scancode независимо от раскладки клавиатуры.

Хотя может быть скучно выполнять проверки ОС и иметь массивные постоянные таблицы, это обычно так, как это делается. Хорошей новостью является SDL для вас, поэтому вы действительно должны использовать имена pygame.K_ *. Если поддержка нескольких раскладок клавиатуры является проблемой, подумайте о добавлении меню конфигурации ввода вместо таблиц жесткого кодирования для каждого макета.

Я хочу оставить некоторые ссылки для дальнейшего чтения, но я не совсем уверен, на что ссылаться. Сейчас я оставлю SDL Input Guide.

+1

Это был очень хороший ответ @kalhartt, спасибо вам большое! Я проверю ссылку. На самом деле стало ясно, что концепция добавления «меню ввода конфигурации» намного лучше (и я также буду использовать имена). На самом деле, я не знал, что они будут меняться, поэтому я предпочел ключевые коды (например, я мог получить доступ к серии кодов клавиш, просто проверив их и создав «константу диапазона», список из них). Но теперь я вижу. Спасибо! –

Смежные вопросы