В структуре SDL_Keysym
есть SDL_Scancode
и SDL_Keycode
членов. В чем разница между ними? Документация на самом деле не проясняет меня. Я попробовал оба, и они, похоже, делают то же самое.В чем разница между кодом физического ключа SDL и кодом виртуального ключа SDL?
ответ
См. the SDL documentation. Scancodes представляют физическое положение клавиш, смоделированных после стандартной QWERTY-клавиатуры, тогда как Keycodes - это символ, полученный нажатием клавиши.
На клавиатуре AZERTY, нажав будет излучать 'Q'
скан и 'a'
код ключа.
Как правило, scancode s - это истинные значения, выделяемые клавиатурой (аппаратными) для ОС, в то время как код клавиатуры - это то, что ОС/библиотека сопоставляет с ним на основе выбранного макета. Макет определяет соответствие между scancode и некоторым виртуальным ключевым кодом. Это часть настроек операционной системы. Здесь, по макет, я имею в виду функциональный макет; есть также механические и визуальные макеты. Узнайте больше о keyboard layouts в Википедии. Концепция кода сканирования и виртуального ключа - explained better с иллюстрацией в MSDN.
Однако SDL использует scancode, чтобы означать что-то другое: scancode ключа в клавиатуре QWERTY США, местоположение которой совпадает с местом, о котором идет речь. Это независимый от устройства способ обозначить ключ, основанный на его местоположении. Место погребение в необычном месте в SDL's manual:
Scancodes предназначены для макс. Подумайте об этом как «пользователь нажал Q-ключ, как на клавиатуре QWERTY США», независимо от того, на самом деле это европейская клавиатура или клавиатура Dvorak или что-то еще. Сканкод всегда является одной и той же ключевой позицией.
Ключ-коды предназначены для компоновки. Подумайте об этом как «пользователь нажал клавишу, обозначенную« Q »на конкретной клавиатуре».
В примере, если вы нажали клавишу, расположенную на двух клавишах справа от CAPS LOCK на клавиатуре США QWERTY, она сообщит об scancode SDL_SCANCODE_S и ключевом коде SDLK_S. Тот же ключ на клавиатуре Dvorak сообщит о scancode SDL_SCANCODE_S и ключевом коде SDLK_O.
В приведенной выше цитате, по макете, это означает функциональную компоновку. main part ручных клавиатур относительно немного краткий по этому вопросу:
значение SDL_Scancode используется для представления физического расположения клавиши клавиатуры на клавиатуре.
Значения SDL_Keycode сопоставляются с текущим расположением клавиатуры и соотносятся с SDL_Scancode.
Какой из них использовать для приложения: scancodes подходят в ситуациях, когда элементы управления зависят от макета (например, клавиши «WASD» как клавиши со стрелками влево), тогда как коды клавиш лучше подходят для ситуаций, когда элементы управления зависят от характера (например, ключ «I» для Inventory).
В приведенной выше цитате, по расположению, руководство означает механическую/физическую компоновку. Таким образом, для управления символом, например, лучше использовать scancode, в то время как для получения ключевого кода имени пользователя лучше.
Я говорил о традиционных кодах сканирования, и, похоже, SDL использовал этот термин для обозначения чего-то еще. Так что да, ваш был верным. Я исправил свой ответ, чтобы отразить это. Спасибо, что терпеливо задавали вопросы, чтобы указать мне в правильном направлении и заставить меня понять это. – legends2k
@ legendends2k Я думал, что я был исправлен, ха-ха! Хорошо спасибо * вы * за подтверждение тем не менее :) – Quentin