2009-03-07 7 views
3

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

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

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

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

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

+0

Ubuntu не unix. Это Linux. Есть разница. – epochwolf

+0

Однако это unix based ... (пост отредактирован наверняка) – Calmarius

+0

Избегайте аргументации и называйте это GNU. См. Http://www.dwheeler.com/sloc/ – ashawley

ответ

7

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

+0

Добавление ссылки сделает этот ответ более полезным. –

+0

http://www.libsdl.org/ .. первый удар по google-ing .. – lexu

+0

добавил ссылку :) –

1

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

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

Если честно, я все еще не вижу, как это может иметь отношение к wxWidgets.

+0

Я уже сделал свои таблицы кода сканирования (я скачал несколько на экранной клавиатуре и получил все коды, которые мне нужны.) – Calmarius

1

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

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

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

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

+0

Однако он работает с 30 (предустановленными) fps с использованием <10% процессора ... Поэтому я думаю, что это не так неправильно ... – Calmarius

+0

Никто не сказал, что это не сработает. Я просто думаю, что это просто не то, что означало поддержка wxWidgets для OpenGL. Он предназначался для приложений, которым требуется поддержка 3D, а не для 3D-игр, нуждающихся в поддержке окон, если вы следите за мной. –

1

Я мог бы быть misunderestimating, что ваш видеть здесь, но, глядя на raw keycode returned собирается привести к аппаратным, ОС, конфигурации и платформы различия, так что вы должны смотреть на virtual keycode returned по key event.

EDIT: Возможно, wxWidgets просто не справляется с этим (сомнительный) . Проблема с ключом numlock заключается в том, что вы вынуждаете вас обойти это (плохо) с помощью необработанного кода сканирования.

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

0

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

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); 

где Input является

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

Есть some indications, что SFML быстрее, чем СВД, однако я предпочитаю использовать его выскочить быстрый и переносимый код, так как я люблю его использование более SDL.

+0

Спасибо за указание SFML, я рад узнать о альтернативах SDL! Тем не менее, эти контрольные показатели, на которые вы указали, ссылаются на SFML быстрее, чем SDL ... при выполнении простой 2D-рендеринга. Этот вопрос относится к 3D-рендерингу :) Опять же, спасибо за указание SFML, я буду учитывать его при работе над 2D! –