Как я могу обрабатывать разные раскладки клавиатуры?

Предположим, у меня есть игра, в которой используются элементы управления WASD на макете QWERTY. Попытка использовать эти элементы управления на, скажем, макете Dvorak не идеальна (эквивалентна <A:H в QWERTY). Очевидно, что я хотел бы использовать те же физические ключи, что и QWERTY (,aoe на DVORAK).

Я придумал несколько возможных решений:

  • Принудительно использовать QWERTY
    • , очевидно, не идеальный, особенно для международных пользователей.
  • Изменение ярлыков на основе раскладки клавиатуры (WASD ->, aoe)
    • заставляет меня создавать карты макета для каждого поддерживаемого макета (автоматически)
    • проще всего для пользователя, если есть больше ярлыков, чем просто WASD
  • Заставить пользователя сами определять ярлыки
    • Более гибкий
    • Раздражает, если есть много ярлыков
    • Может использоваться в сочетании со вторым вариантом
  • Использование аппаратных клавишных кодов
    • совместим с клавиатурой?

Как обычно обрабатывается этот тип вещей?

9 голосов | спросил beatgammit 31 MaramSun, 31 Mar 2013 06:02:57 +04002013-03-31T06:02:57+04:0006 2013, 06:02:57

4 ответа


8

Слушайте коды сканирования. Как это сделать, зависит от вашей ОС, которую вы не указали. В Windows вы можете получить scancode для данного кода виртуального ключа от WM_KEYDOWN и друзей, используя MapVirtualKey . Коды сканирования основаны на физическом ключе и не подвержены влиянию макета.

Быстро прочитайте http://www.altdevblogaday.com/2011/10/02/i-never-managed-to-go-left-on-first-try/.

Итак, как сказал Никол Болас, вы можете и должны позволить пользователям работать с ним. Но просто заставить его работать прямо из коробки не сложно, и ваши пользователи оценят его.

Обратите внимание, что вы (вероятно) неправильно обрабатываете ввод символов, как и большинство разработчиков игр. Убедитесь, что для текста всегда используется WM_CHAR (или эквивалент в других операционных системах), а не используя WM_KEYDOWN для ввода текста. Совершенно неверно предполагать, что при нажатии клавиши «a» вы должны ввести «a» в элемент управления текстовым вводом из-за использования «Мертвых ключей» на некоторых макетах. Вы также можете поддерживать IME (или эквивалент ОС) для рынков Восточной Азии, которые имеют гораздо больше символов, которые могут разумно поместиться на клавиатуре и нуждаться в специальном интерфейсе для ввода. Обращение с IME в игре - это боль (обработка вообще - это боль), но стоит, на мой взгляд, увеличить привлекательность вашего продукта на гораздо более широкий набор рынков. Опять же, WM_KEYDOWN никогда не будет использоваться для текста, когда-либо.

ответил Sean Middleditch 31 MaramSun, 31 Mar 2013 06:56:13 +04002013-03-31T06:56:13+04:0006 2013, 06:56:13
5

Вы должны всегда дать игроку возможность изменять свои ключевые назначения. Вот как он «обычно обрабатывается»: пусть игрок меняет их. Некоторые игроки будут устанавливать свою клавиатуру на QWERTY, когда они будут играть в игры, потому что это то, что ожидают большинство игр. Некоторые оставят их установленными на их нынешнюю клавиатуру и полагаются на возможность изменения ключей.

ответил Nicol Bolas 31 MaramSun, 31 Mar 2013 06:30:32 +04002013-03-31T06:30:32+04:0006 2013, 06:30:32
2

В случае, если вы не можете прослушивать коды сканирования (например, при разработке флеш-игры), вы можете сделать привязку клавиш, которая работает для максимально возможного количества макетов. Большинство раскладок клавиатуры очень схожи, за некоторыми исключениями.

Раскладки клавиатуры по стандарту ISO 9995 (это больше всего) расположены следующим образом:

Раскладка клавиатуры после ISO

В основном черные клавиши безопасны в использовании.

ответил API-Beast 31 MarpmSun, 31 Mar 2013 17:10:19 +04002013-03-31T17:10:19+04:0005 2013, 17:10:19
2

Большинство крупных бюджетных игр (с международным дистрибьютором) будут работать из коробки, используя ZQSD вместо WASD для азертитных макетов. Порядочная игра также представит макет на первом уровне, другие позволят игроку открыть его на экране настройки. Стратегия реализации может быть обнаружена, попросив ОС переключить макеты. Либо игра использует scancodes (позиции) внутри, и сопоставляет их с ключевыми кодами (символами) при отображении диалогов и подсказок конфигурации; или он использует внутренние коды клавиш и обнаруживает макет при запуске или при первом запуске.

Первая стратегия (scancodes внутри) более надежна, но требует немного внимания, чтобы предотвратить просачивание абстракции. Не забудьте переназначить scancodes на клавиатурные коды при представлении ключей пользователю (в руководствах, подсказках и диалоговом окне настройки). Вам все равно придется смотреть на коды клавиш при вводе текста (например, если игрок набирает свое имя). Если вам нужно обрабатывать больше текста, посмотрите на использование поддержки ввода текста в платформе, которая выходит за рамки игрового движка (обрабатывает мертвые клавиши, капсюль, копирование, расширенные методы ввода ...).

При переносе игры, в которой никогда не использовались scancodes (что не так с приличным движком, поскольку scancodes также ближе к аппаратным средствам и быстрее), другая стратегия может быть более практичной. Вы можете сопоставить scancodes с ключевыми кодами с помощью функций SDL2 SDL_GetKeyFromScancode и SDL_GetScancodeFromKey или эквивалентные для платформы эквиваленты. Если вы также используете цикл событий SDL2, эти функции будут оставаться точными для коммутаторов компоновки. Избегайте таких функций, как GetKeyboardLayout () в Windows; нет гарантии, что вы сможете найти макет в известном списке.

ответил Gabriel 24 Jpm1000000pmFri, 24 Jan 2014 20:36:00 +040014 2014, 20:36:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132