ОС и реализация независимого доступа к клавиатуре?
-
05-07-2019 - |
Вопрос
Я сделал 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.