Як я можу обробляти різні розкладки клавіатури?


10

Скажімо, у мене гра, яка використовує елементи керування WASD на макеті QWERTY. Намагаючись використовувати ці елементи управління, скажімо, макет Dvorak не є ідеальним (еквівалентно <A:HQWERTY). Очевидно, я хотів би використовувати ті ж фізичні ключі, що і QWERTY ( ,aoeна DVORAK).

Я придумав кілька можливих рішень:

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

Як зазвичай обробляються такі речі?

Відповіді:


9

Прослуховуйте коди сканування. Як це зробити, залежить від вашої ОС, яку ви не перераховували. У Windows ви можете отримати код сканування для даного коду віртуального ключа від 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 ніколи не використовується для тексту.


Хороша порада. Я не перераховував ОС, тому що шукав загальні вказівки / очікування (я можу обробити деталі реалізації).
beatgammit

6

Ви завжди повинні дати гравцеві можливість змінювати свої ключові завдання. Ось як це "зазвичай обробляється": нехай гравець їх змінює. Деякі гравці встановлять свою клавіатуру на QWERTY, коли вони грають в ігри, тому що саме те очікує більшість ігор. Деякі залишать їх встановленими на поточній клавіатурі та покладаються на можливість зміни клавіш.


1
А як щодо зміни мови? Наприклад, чи очікують французи змінити WASD -> ZQSD, якщо вони хочуть зберегти свою макет AZERTY, навіть якщо гра є французькою мовою?
beatgammit

1
@tjameson: Ви читали мою відповідь? Нехай вони переглянуть свої ключові завдання . Тоді проблем не буде.
Нікол Болас

1
Так, я ж прочитав вашу відповідь, і я , ймовірно , піти з вашою порадою. Я просто хотів переконатися, що не було сподівань на доставку користувачам у різних місцях.
beatgammit

3

У випадку, якщо ви не можете прослухати коди сканування (як, наприклад, при розробці флеш-гри), ви можете зробити прив'язку клавіш, яка працює для якомога більшої кількості макетів. Більшість макетів клавіатури дуже схожі, за кількома винятками.

Розкладки клавіатури, що відповідають ISO 9995 (це найбільше), розташовані так:

Розкладка клавіатури після ISO

В основному чорні клавіші безпечні у використанні.


Детальніше про розкладку клавіатур див. У QWERTY , QWERTZ , AZERTY та QZERTY
Чак Уолборн

3

Більшість ігор з великим бюджетом (ті, які мають міжнародного дистриб'ютора) працюватимуть нестандартно, використовуючи ZQSD замість WASD для макетів азерти. Гідна гра також введе макет на першому рівні, інші дозволять гравцеві відкрити його через екран налаштування. Стратегію реалізації можна виявити, попросивши ОС змінити макети. Або гра використовує скан-коди (позиції) внутрішньо, і відображає їх у клавішних кодах (символах), коли відображаються діалоги та підказки конфігурації; або він використовує внутрішні клавіші та виявляє макет при запуску або при першому запуску.

Перша стратегія (скан-коди всередині) є більш надійною, але вимагає трохи обережності, щоб запобігти протіканню абстракції. Пам’ятайте про повторний перезапис сканерів на коди клавіш, коли представляєте користувачеві ключі (у навчальних посібниках, підказках та діалогах налаштування). Вам потрібно буде дивитися на ключові коди під час введення тексту (дозволяючи гравцеві, наприклад, вводити їх ім'я). Якщо вам потрібно обробити більше тексту, ніж це, погляньте на підтримку введення тексту на платформі, яка знаходиться поза межами ігрового двигуна (обробляє мертві клавіші, замикання, копіювання, вдосконалення методів введення…).

Переносячи гру, яка ніколи не використовувала скан-коди (що не буває при гідному двигуні, оскільки сканкоди також ближче до апаратного та швидшого), інша стратегія може бути більш практичною. Ви можете зіставити коди сканерів на ключові коди, використовуючи функції SDL2 SDL_GetKeyFromScancode та SDL_GetScancodeFromKey , або еквіваленти, характерні для платформи. Якщо ви також використовуєте цикл подій SDL2, ці функції залишатимуться точними для всіх комутаторів компонування. Уникайте таких функцій, як GetKeyboardLayout () у Windows; немає гарантії, що ви зможете знайти макет у відомому списку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.