Pergunta

Fiz um jogo FPS com o MSVC ++, que está funcionando muito bem no Windows. Mas agora estou tentando torná -lo portátil (pelo menos quero criar um Linux e uma versão do Windows), então decidi alterar o IDE para codificar :: blocos e a estrutura para o wxwidgets. Mas parece que os códigos de chave virtual e os códigos de varredura são diferentes em diferentes sistemas.

Anteriormente, experimentei que os códigos de chave virtuais podem ser diferentes, mesmo no mesmo sistema operacional, mas em um computador diferente (recebi relatos de bugs sobre eles incapazes de controlar o personagem (dependendo do estado numlock, lol, não piada), que é fixo quando muda o Código para usar scancodes em vez de códigos Virtkey) (Editar: com os códigos WxWidgets e Virtkey e Scan no Numpad tem valores diferentes, dependendo do estado de Numlock, Bang!)

Agora, com o WXWIdgets, parece que o WXKEYEVENT :: getRawKeyCode e o código obtido anteriormente no lparam do WM_KEYDOWN são diferentes. E também recebo um código de verificação completamente diferente no Linux (Ubuntu) do getRawKeyCode.

Bem, eu posso fazer minha própria tabela de código de digitalização pressionando todas as teclas e vendo qual código ela dá, mas o único problema que o Ubuntu executa no meu laptop, e o laptop não tem um teclado completo ... mas eu preciso de todos eles Para fazer as configurações de controle funcionarem.

Portanto, a pergunta: existe uma maneira padrão e de plataforma cruzada de obter o mesmo código para a mesma chave (a chave na mesma posição para ser mais precisa)? (pelo menos no Windows e Linux)

Foi útil?

Solução

Caso você ainda não tenha considerado, você poderá usar Sdl.

Outras dicas

Sendo este um FPS, o kit de ferramentas gráficos de nível inferior que você está usando faz uma enorme diferença (estou assumindo que você não está escrevendo gráficos 3D no wxwidgets). Se você está usando o OpenGL, você já olhou para o que EXCESSO pode fazer?

o Glutkeyboardfunc e GLUTSpecialfunc combinado com glutgetmodifiers Pode ser suficiente para o código do teclado de plataforma cruzada, e o GLUT pode até ser usado para outros dispositivos de entrada.

Para ser sincero, ainda não vejo como isso poderia ter algo a ver com o WXWIDGETS.

Minha opinião é que é completamente errado usar o WXWidgets para codificar jogos em 3D em ritmo acelerado. No desenvolvimento de jogos "Hardcore", você deve usá -lo para desenvolver ferramentas de suporte, como editores e conversores.

Sdl é o caminho a percorrer. Pode parecer bastante básico, mas quando você começa a sacrificar crianças pequenas aos deuses profanos de SDL, coisas como Sdl_image (Perfeito para ler vários formatos de arquivo de imagem - na medida em que eu às vezes uso SDL apenas para ler por exemplo, jpeg) ou Sdl_mixer (Solução única que você precisa de ler e reproduzir áudio básico - Ogg, WAV, ...).

Portanto, não procure mais, o SDL. Até o suporte gráfico 2D é bom quando você começa a usar SDL_GFX. O SDL pode, a princípio, parecer básico, mas depois de contar com todas as bibliotecas extras construídas em torno dele e, depois de codificar alguns invólucros, verá o SDL é o equilíbrio perfeito entre necessidades nuas e facilidade de uso avançado.

Ficarei feliz em ajudá -lo de alguma forma com o SDL, pois acho isso tão incrível.

Eu posso estar mal aula o que você está vendo aqui, mas olhando para o Raw Keycode retornou vai resultar em hardware, sistema operacional, configuração e diferenças de plataforma, então você deve estar olhando para o Virtual KeyCode retornado por a evento-chave.

EDIT: Talvez wxWidgets simplesmente não lida com certo (duvidoso). A questão da tecla Numlock é "forçar" você a contornar isso (mal) usando o código de verificação bruto.

Se for esse o caso, você não precisa jogar fora o que fez, mas se você adicionar Sdl Apenas para o material de entrada, você encontrará chamadas que retornam o Sdl_keysym Não apenas devolva o hardware Scancode (com o qual você não pode fazer nada sobre "consertar"), mas também mapeá -lo para um caráter unicode e um símbolo virtual, que é que eu acho que você está procurando. Espero que suas chamadas não tenham esse problema de modificador de numlock.

Se você não quer usar SDL, eu recomendo SFML - Biblioteca multimídia simples e rápida. É multiplataforma e realmente simples de usar. Por exemplo, de Seção de tutoriais:

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

onde está a entrada

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

Algumas indicações Esse SFML é mais rápido que o SDL, no entanto, eu tendem a usá -lo para sacar o código rápido e portátil, pois gosto mais de seu uso do que SDL.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top