OIS + Ogre : No se capturan eventos de teclado

Bueno, sigo con mi pelea, aunque esta vez no es con Ogre, sino con OIS. He añadido a mi miniaplicación una pequeña prueba para ver como se capturan los eventos de teclado.

Creo el InputSystem correctamente (creo la lista de parámetros, obtengo el identificador de ventana de Ogre, y evito que la ventana de Ogre se haga con el control del teclado y ratón, con los parámetros x11_keyboard_grab, x11_mouse_hide, x11_mouse_grab a false). También creo correctamente el objeto teclado.

Pero en cuanto pulso la primera tecla, una vez lanzada la aplicación, la función keyboard->capture() no termina.

Mi miniaplicación de prueba funciona como sigue: tengo una clase que hereda tanto de OIS::KeyListener como de Ogre::FrameListener, y que tiene un booleano interno continuar, a true. Mientras continuar=true, se continuarán imprimiendo nuevos frames con normalidad.

En "frameStarted", actualizo el estado interno del teclado (keyboard->capture()). Si se ha pulsado alguna tecla, se llamará a la función keyPressed. En tal caso, si en concreto es la letra Q, continuar = false, y este valor es el que devuelvo en frameEnded. Eso significa que en cuanto se detecte la pulsación de la letra Q, al siguiente frameEnded se finalizará la ejecución de la aplicación, ya que éste devolverá false.

Pero en cuanto pulso la primera tecla, se la que sea, capture no finaliza, y evidentemente la aplicación se queda bloqueada y la tengo que cerrar en consola con top.

Espero que este sea un problema frecuente, o al menos conocido.

Saludos,
Peregring-lk

Imagen de Peregring_Lok0ooo0
+1
0
-1

Bueno, el problema parecía relacionado con la inicialización "Buffered" del teclado. Iniciándolo "unbuffered" no entra en bucle infinito, pero aún así sigue sin reconocerme las pulsaciones de las teclas (en concreto, nunca se llama a "KeyPressed").

Mi pregunta ahora es, ¿existe alguna diferencia en el uso buffered o unbuffered del teclado?. Porque, que yo sepa (según lo que he leido) el hecho de decirle al sistema que use un buffer o no afecta a la gestión interna del teclado por OIS, no al uso que tú hagas de él.

¿Alguna pista?

Saludos,
Peregring-lk

+1
0
-1
Imagen de Sanguinario_Joe
+1
0
-1

Hola!

Te he mandado un mail, a ver si te apetece que cooperemos.

Pero vayamos a lo nuestro!

libOIS admite dos maneras de manejar los eventos, buffered keys, y unbuffered keys.

Buffered keys:

Da igual cuando presiones la tecla, el recordará que la tecla fue pulsada, y al principio de cada frame llamara a la funcion que determines (callback) para que el evento sea ajustado. Es una forma simple de manejarlo, pero muy peligrosa. Yo nunca he sido partidario de sus uso, ya que si tratas de informar sobre algo a libOIS dentro de la funcion PressKey, se volvera a generar el evento, y te quedaras encerrado en la funcion para siempre jamas.

UnBuffered keys:

Mi forma favorita. libOIS solo actualiza el estado de las teclas cuando le sea ordenado (luego debe coincidir en ese momento que la tecla este pulsada o despulsada), pero eso no es un problema, el problema es que en un principio no sabes si la tecla ha sido pulsada en ese frame, o lo fue en uno anterior, y lo que ocurre es que sigue pulsada. Esto lo hace un poco mas incomodo, porque tienes que guardar informacion sobre el estado de las teclas para saber si en el siguiente frame la pulsa/despulsa, o ya estaba asi.
Tambien hay que tener en cuenta que ahora OIS no llamara a ninguna funcion (PressKey), tendras que llamarla tu manualmente. Ademas, dentro de la funcion deberas llamar al principio a:

    Keyboard->capture();
    Mouse->capture();
    if( Joy ) Joy->capture();

Para que actualice el estado de las teclas.

---

Saludos!!!

+1
0
-1
Imagen de Peregring_Lok0ooo0
+1
0
-1

Muchas gracias Sanguinario.

El problema ya está solucionado. No te cuento por qué razón no me funcionaba el teclado, que te vas a reir de mí para siempre. Lo que está claro que a partir de ahora leeré más atentamente el código que yo mismo escribo xD.

+1
0
-1