ОС и реализация независимого доступа к клавиатуре? - PullRequest
3 голосов
/ 07 марта 2009

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

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

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

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

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

Ответы [ 5 ]

7 голосов
/ 07 марта 2009

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

1 голос
/ 15 марта 2009

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

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

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

1 голос
/ 14 марта 2009

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

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

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

Я буду рад помочь вам с SDL, так как я нахожу его таким классным.

1 голос
/ 10 марта 2009

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

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

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

0 голосов
/ 16 марта 2009

Если вы не хотите использовать 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.

...