Ver la versión completa : Problema para reconocer la pulsacion simultanea de teclas en OpenGL
Fergus1986
26/02/2008, 23:40
Buenas...
Estoy programando en C y utilizando OpenGL y GLUT. Quiero mover un objeto, para lo cual utilizo glutKeyboardFunc y glutSpecialFunc, y las constantes GLUT_KEY_LEFT, y demás... Hasta aquí todo perfecto. El problema reside en que no se como reconocer que se pulsan dos teclas a la vez (por ejemplo, flecha arriba, flecha izquierda, para hacer diagonales). He estado buscando en la API de OpenGL y GLUT y no he encontrado nada. Si sabéis algún modo de implementarlo me gustaría que me ayudáseis...
Estoy programando en GNU/Linux, por lo que, si se os ocurre alguna forma de detectar el doble evento de pulsación de teclado utilizando alguna otra biblioteca, estoy abierto a cualquier sugerencia.
:brindis:
Electric Dreams
26/02/2008, 23:46
En estos casos basta con el operador lógico AND... (no sé si me entiendes) :D
Fergus1986
27/02/2008, 00:19
No, no te entiendo
Yo tengo el siguiente código:
main(){
// El programa
glutSpecialFunc(girar);
// El resto del programa
}
void girar(int key, int x, int y){
switch(key){
case GLUT_KEY_RIGHT:
ejeY=-1.0;
incrementoY=1;
rotarY();
break;
case GLUT_KEY_LEFT:
ejeY=-1.0;
incrementoY=-1;
rotarY();
break;
case GLUT_KEY_UP:
ejeX=-1.0;
incrementoX=1;
rotarX();
break;
case GLUT_KEY_DOWN:
ejeX=-1.0;
incrementoX=-1;
rotarX();
break;
default:
break;
}
}
Si te refieres a introducir esto:
case GLUT_KEY_UP && GLUT_KEY_RIGHT:
ejeZ=1.0;
incrementoZ=1;
rotarZ();
break;
no funciona
Si esperas que arranque linux, te lo miro...
< - >
Creo que no es exactamente lo que buscas pero imagino que te ayudara.
Lo que yo hice fue usar la funcion glutGetModifiers(), la cual devuelve un entero predefinido por glut dependiendo del la tecla que tengas presionada al principio. Asi por ejemplo, GLUT_ACTIVE_CTRL indicaria que tienes pulsada la tecla control y que ademas vas a pulsar otra.
Si ves este sencillo ejemplo, te darás cuenta de su uso:
void teclasEspeciales(int key, int x, int y){
//Control de dos teclas pulsadas
int modificadores = glutGetModifiers();
//Control+tecla especial
if (modificadores == GLUT_ACTIVE_CTRL) {
switch (key) {
case GLUT_KEY_LEFT: if (move) anteriorPunto(1);
break;
case GLUT_KEY_RIGHT: if (move) siguientePunto(1);
break;
//reset de la vista
case GLUT_KEY_F1: resetVista(vista); //reseteamos vista
break;
//Escalado 1:10
case GLUT_KEY_F2: if (!e110){
e110 = 1; //ya he escalado 1:10
grado_escalax = 10;
grado_escalay = 1;
colocarVista(vista);
}//if
... ... ...
Mírate la documentación de glutGetModifiers() porque recuerdo que podía devolver varios valores predefinidos (GLUT_ACTIVE_SHIFT tambian lo devolvia si mantenías la tecla mayusculas).
No es exactamente lo que buscas pero espero que te ayude.
Un saludo
:brindis:
Fergus1986
27/02/2008, 01:00
Gracias por la respuesta tan rápida...
La función glutGetModifiers la utilizo para detectar que pulso Ctrl+A. Y en principio no me sirve para lo que necesito. De todas maneras, me volveré a mirar la especificación para esa función, a ver si saco algo...
Electric Dreams
27/02/2008, 01:45
No, no te entiendo
Si te refieres a introducir esto:
case GLUT_KEY_UP && GLUT_KEY_RIGHT:
ejeZ=1.0;
incrementoZ=1;
rotarZ();
break;
no funciona
Perdón, porque yo uso una función propia para leer las pulsaciones del teclado en mis programas y al no ver código cuando lo lei, la tome "por defecto".
En tal caso, anida un SWITCH con los dos CASEs pertinentes en cada uno de los CASEs del SWITCH principal.
KaosOverride
27/02/2008, 04:06
Si no me equivoco, esas funciones devuelven las teclas que se van pulsando, y van de uno en uno, no puedes ver "dos a la vez" porque no se generan dos a la vez, se ponen en cola y la funcion va sacando uno en uno...
Sospecho que tendras que usar variables que se actualicen segun pulsas (Poner a true o 1) y sueltas (Poner a false o 0) y despues operar con dichas variables
Si son 2 o 3 combinaciones solo, puedes usar variables sueltas, o pequeñas matrices, si quieres aspirar a algo mas general igual tendras que currarte una matriz que contemble todas las teclas posibles y despues evaluar las combinaciones.
A ver si te sirve de pista... :)
EDIT: He encontrado esto:
HOWTO: Check if a Key is Down
One thing I liked in both Allegro and DirectInput, is that you could determine if any key on the keyboard was down at any time by simply looking up an entry in an array. You can do the exact same thing with GLUT by setting up two callback functions. This is shown below. You will need GLUT 3.7 for this to work, as glutKeyboardUpFunc is required to set the necessary callback.
int KeyDown[256];
void keyboard(unsigned char key, int x, int y)
{
KeyDown[key] = 1;
}
void keyboardUp(unsigned char key, int x, int y)
{
KeyDown[key] = 0;
}
...
memset( KeyDown, 0, sizeof( KeyDown ) );
glutKeyboardFunc( keyboard );
glutKeyboardUpFunc( keyboardUp );
...
if ( KeyDown['a'] )
shootGun();
...
Usando esa matriz, verificas las teclas que te haga falta con operandos, ya que las glutKeyboardFunc y glutKeyboardUpFunc las usas esclusivamente para actualizar tu matriz de teclado y verificarla despues
Para las felchas de cursor, usas otra funcion, pues en ella usa otra matriz de manera similar y la actualizas y compruebas despues. Al loro a poner la callback tambien para los eventos de liberar la tecla ;)
A ver si asi te funciona :brindis:
Ñuño Martínez
27/02/2008, 10:52
GLUT es malo. Te recomiendo que te pases a AllegroGL (http://allegrogl.sf.net/) o a SDL (http://www.libsdl.org/).
GLUT es malo. Te recomiendo que te pases a AllegroGL (http://allegrogl.sf.net/) o a SDL (http://www.libsdl.org/).
Malo porque? Depende de para que se use, no?
Yo programo aplicaciones basadas en la geodesia que luego mi empresa vende a sus clientes y por ahora no ha habido ninguna queja.
Hasta donde yo se, AllegroGL y SDL estan mas orientadas a videojuegos, no?
¿Que otras alternativas hay (Bajo C) que no sean las antes mencionadas?
Un saludo
:brindis:
Fergus1986
27/02/2008, 13:32
Si no me equivoco, esas funciones devuelven las teclas que se van pulsando, y van de uno en uno, no puedes ver "dos a la vez" porque no se generan dos a la vez, se ponen en cola y la funcion va sacando uno en uno...
Sospecho que tendras que usar variables que se actualicen segun pulsas (Poner a true o 1) y sueltas (Poner a false o 0) y despues operar con dichas variables
Si son 2 o 3 combinaciones solo, puedes usar variables sueltas, o pequeñas matrices, si quieres aspirar a algo mas general igual tendras que currarte una matriz que contemble todas las teclas posibles y despues evaluar las combinaciones.
A ver si te sirve de pista... :)
Gracias por la aclaración y la explicación... Yo ya me estaba imaginando que por ahí iban los tiros, pero como estoy empezando con la programación gráfica, y los eventos, pues estoy todavía demasiado verde... Ahora me miraré el código para ver si puedo implementarlo.
GLUT es malo. Te recomiendo que te pases a AllegroGL (http://allegrogl.sf.net/) o a SDL (http://www.libsdl.org/).
Respecto a lo de Glut, yo como he dicho acabo de empezar, y según mis profesores Glut es la mejor para empezar por su sencillez e integración con OpenGl.
Ñuño Martínez
27/02/2008, 15:11
Malo porque? Depende de para que se use, no?
Yo programo aplicaciones basadas en la geodesia que luego mi empresa vende a sus clientes y por ahora no ha habido ninguna queja.
Hasta donde yo se, AllegroGL y SDL estan mas orientadas a videojuegos, no? Sí, están para juegos. No sabía que era para una aplicación geodésica de esas.
Respecto a lo de Glut, yo como he dicho acabo de empezar, y según mis profesores Glut es la mejor para empezar por su sencillez e integración con OpenGl. AllegroGL también es muy sencilla, de echo mucho más que SDL y ahora que van a integrar AllegroGL en la versión 5 de Allegro (http://alleg.sf.net/) pues más todavía.
Y mi experiencia me ha enseñado a no fiarme un pelo de lo que diga un profesor sobre la calidad de un programa, sistema o lenguaje de programación. Ahora bien, si es para un trabajo universitario o escolar sigue a rajatabla las indicaciones del profesor, que una vez hayas aprobado ya podrás olvidarlo y trabajar bien.
Aviso: Todo esto lo he escrito siguiendo mi experiencia, que no es poca.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.