Pregunta

Hice un juego de FPS con MSVC ++ que se ejecuta muy bien en Windows. Pero ahora estoy tratando de hacerlo portátil (al menos quiero crear un linux y una versión de Windows), así que decidí cambiar el IDE a Código :: Bloques y el marco a wxWidgets. Pero parece que los códigos de clave virtual y los códigos de escaneo son diferentes en diferentes sistemas.

Anteriormente, experimenté que los códigos de tecla virtuales pueden ser diferentes incluso en el mismo sistema operativo pero en una computadora diferente (recibí informes de errores acerca de que no pueden controlar el carácter (dependiendo del estado de bloqueo numérico, jajaja, no broma), que se corrigió cuando cambie el código para usar scancodes en lugar de códigos virtkey) (Editar: con wxWidgets, tanto los códigos virtkey como los códigos de escaneo en el teclado numérico tienen diferentes valores según el estado del bloqueo numérico, ¡bang!)

Ahora, con wxWidgets parece que wxKeyEvent :: GetRawKeyCode y el código obtenido anteriormente de lParam de WM_KEYDOWN son diferentes. Y también obtengo un código de escaneo completamente diferente en linux (ubuntu) de GetRawKeyCode.

Bueno, puedo hacer mi propia tabla de códigos de escaneo presionando todas las teclas y viendo qué código da, pero el único problema que ubuntu ejecuta en mi computadora portátil, y la computadora portátil no tiene un teclado completo ... Pero los necesito a todos para hacer funcionar la Configuración de control.

Entonces, la pregunta: ¿Existe una forma estándar y multiplataforma para obtener el mismo código para la misma clave (la clave en la misma posición para ser más precisa)? (al menos en windows y linux)

¿Fue útil?

Solución

En caso de que aún no lo haya considerado, puede usar SDL .

Otros consejos

Al ser un FPS, el conjunto de herramientas de gráficos de nivel inferior que está utilizando hace una gran diferencia (supongo que no está escribiendo gráficos 3D en wxWidgets). Si está utilizando OpenGL, ¿ha visto qué GLUT puedo hacer?

El glutKeyboardFunc y glutSpecialFunc combinado con glutGetModifiers podría ser suficiente para el código de teclado multiplataforma, e incluso GLUT puede ser utilizado para otros dispositivos de entrada.

Sin embargo, para ser honesto, todavía no veo cómo esto podría tener algo que ver con wxWidgets.

Mi opinión es que es completamente incorrecto usar wxWidgets para codificar juegos 3D de ritmo rápido. En " hardcore " desarrollo de juegos, debe usarlo para desarrollar herramientas de soporte, como editores y conversores.

SDL es el camino a seguir. Puede parecer bastante básico, pero una vez que comienzas a sacrificar niños pequeños a los impíos dioses de SDL, cosas como SDL_image (perfecto para leer numerosos formatos de archivo de imagen, en la medida en que a veces uso SDL solo para leer, por ejemplo, JPEG) o SDL_mixer (la única solución que necesita para leer y reproducir audio básico: OGG, WAV, ...).

Así que no busques más allá de SDL. Incluso la compatibilidad con gráficos 2D es buena una vez que comienzas a usar SDL_gfx. Al principio, SDL puede parecer básico, pero una vez que cuente con todas las bibliotecas adicionales creadas a su alrededor, y una vez que codifique algunos envoltorios a su alrededor, verá que SDL es el equilibrio perfecto entre las necesidades básicas y la facilidad de uso avanzado.

Estaré encantado de ayudarle de cualquier manera con SDL ya que me parece increíble.

Puede que esté malinterpretando lo que está viendo aquí, pero mirando clave clave devuelta generará diferencias de hardware, sistema operativo, configuración y plataforma, por lo que debería consultar clave virtual devuelta por un evento clave .

EDITAR: Tal vez wxWidgets simplemente no lo maneja bien (dudoso) . El problema de la clave numlock es " forzando " para evitar esto (mal) mediante el uso del código de escaneo en bruto.

Si ese es el caso, no necesita desechar lo que ha hecho, pero si agrega SDL solo para las cosas de entrada, encontrará llamadas que devuelven SDL_keysym don no solo devuelva el código de hardware (que no puede hacer nada para solucionarlo), sino que también lo asigne a un carácter Unicode y un símbolo virtual, que es lo que está buscando. Esperemos que sus llamadas no tengan este problema modificador numlock.

Si no quiere usar SDL, le recomiendo SFML - Biblioteca multimedia simple y rápida . Es multiplataforma y realmente simple de usar. Por ejemplo, en la sección de tutoriales :

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

donde está la entrada

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

Hay algunas indicaciones de que SFML es más rápido que SDL, sin embargo, tiendo a usarlo para sacar código rápido y portátil, ya que me gusta más su uso que SDL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top