ОС и реализация независимого доступа к клавиатуре?

StackOverflow https://stackoverflow.com/questions/621716

Вопрос

Я сделал FPS-игру для MSVC ++, которая отлично работает на Windows. Но сейчас я пытаюсь сделать его переносимым (по крайней мере, я хочу создать версию для Linux и Windows), поэтому я решил изменить IDE на Code :: Blocks, а структуру - на wxWidgets. Но похоже, что коды виртуальных клавиш и коды сканирования различны в разных системах.

Ранее я обнаружил, что виртуальные коды клавиш могут отличаться даже на одной и той же операционной системе, но на разных компьютерах (я получал сообщения об ошибках о том, что они не могут контролировать символ (в зависимости от состояния numlock, lol, not joke), что исправлено. при изменении кода использовать коды сканирования вместо кодов virtkey) (edit: с помощью wxWidgets коды virtkey и scan на numpad имеют разные значения в зависимости от состояния numlock, взрыв!)

Теперь с wxWidgets кажется, что wxKeyEvent :: GetRawKeyCode и код, полученный ранее из lParam WM_KEYDOWN, отличаются. И я также получаю совершенно другой код сканирования на Linux (Ubuntu) из GetRawKeyCode.

Ну, я могу создать свою собственную таблицу кодов сканирования, нажав все клавиши и посмотрев, какой код он выдает, но единственная проблема, с которой Ubuntu работает на моем ноутбуке, а у ноутбука нет полноценной клавиатуры ... Но мне нужны все они, чтобы настройки управления работали.

Итак, вопрос: существует ли стандартный и кроссплатформенный способ получить один и тот же код для одного и того же ключа (точнее, ключа в той же позиции)? (по крайней мере, для Windows и Linux)

Это было полезно?

Решение

Если вы еще не рассмотрели этот вопрос, вы можете использовать SDL .

Другие советы

Поскольку это FPS, низкоуровневый графический инструментарий, который вы используете, имеет огромное значение (я предполагаю, что вы не пишете трехмерную графику в wxWidgets). Если вы используете OpenGL, ознакомились ли вы с тем, что GLUT можно сделать?

glutKeyboardFunc и glutSpecialFunc в сочетании с glutGetModifiers может быть достаточно для кросс-платформенного кода клавиатуры, и GLUT может даже быть достаточным используется для других устройств ввода.

Честно говоря, я до сих пор не понимаю, как это может иметь какое-либо отношение к wxWidgets.

Мое мнение таково, что использовать wxWidgets для написания быстро развивающихся 3D-игр совершенно неправильно. В "хардкор" разработка игр, вы должны использовать ее для разработки вспомогательных инструментов, таких как редакторы и конвертеры.

SDL - это путь. Это может показаться довольно простым, но как только вы начнете жертвовать маленькими детьми нечестивым богам SDL, например, SDL_image (идеально подходит для чтения многочисленных форматов файлов изображений - в той степени, в которой я иногда использую SDL исключительно для чтения, например, JPEG) или SDL_mixer (единственное решение, необходимое для чтения и воспроизведения основного звука - OGG, WAV, ...).

Так что смотрите не дальше SDL. Даже поддержка 2D-графики хороша, как только вы начнете использовать SDL_gfx. Сначала SDL может показаться базовым, но как только вы посчитаете все дополнительные библиотеки, построенные вокруг него, и, как только вы закодируете несколько оберток вокруг него, вы увидите, что SDL - это идеальный баланс между необходимыми потребностями и простотой расширенного использования.

Я буду рад помочь вам с SDL, так как я нахожу это потрясающим.

Возможно, я недооцениваю то, что вы видите здесь, но, глядя на необработанный ключевой код, возвращенный приведет к различиям в оборудовании, операционной системе, конфигурации и платформе, поэтому вы должны обратить внимание на виртуальный код ключа, возвращенный ключевым событием .

РЕДАКТИРОВАТЬ: Может быть, wxWidgets просто не справляется с этим правильно (сомнительный) . Проблема с ключом numlock заключается в «принуждении» обойти это (плохо) с помощью необработанного кода сканирования.

В этом случае вам не нужно выбрасывать то, что вы сделали, но если вы добавите SDL просто для ввода информации вы найдете вызовы, которые возвращают SDL_keysym don не просто вернуть аппаратный скан-код (который вы ничего не можете сделать с «исправлением»), но также сопоставьте его с символом Unicode и виртуальным символом, что, я думаю, вы ищете. Надеюсь, у их звонков нет этой проблемы с модификатором numlock.

Если вы не хотите использовать SDL, я рекомендую SFML - простую и быструю мультимедийную библиотеку . Это мультиплатформенный и действительно простой в использовании. Например, из раздела учебных пособий :

bool         LeftKeyDown     = Input.IsKeyDown(sf::Key::Left);
bool         RightButtonDown = Input.IsMouseButtonDown(sf::Mouse::Right);
bool         Joy0Button1Down = Input.IsJoystickButtonDown(0, 1);
unsigned int MouseX          = Input.GetMouseX();
unsigned int MouseY          = Input.GetMouseY();
float        Joystick1X      = Input.GetJoystickAxis(1, sf::Joy::AxisX);
float        Joystick1Y      = Input.GetJoystickAxis(1, sf::Joy::AxisY);
float        Joystick1POV    = Input.GetJoystickAxis(1, sf::Joy::AxisPOV);

где ввод

const sf::Input& Input = App.GetInput();

Есть некоторые указания , что SFML быстрее, чем SDL, однако я склонен использовать его для быстрого и переносимого кода, так как мне больше нравится его использование, чем SDL.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top