[Tutorial] II.4 - glutKeyboardFunc()

Ver el tema anterior Ver el tema siguiente Ir abajo

[Tutorial] II.4 - glutKeyboardFunc()

Mensaje  HarZe el Miér Jul 22, 2009 4:45 pm

II.4 Recoge la tecla pulsada: glutKeyboardFunc()
Novedades:
  • glutKeyboardFunc()


Ahora, definitivamente vamos a interactuar con el programa, a través del teclado. El programa es prácticamente el del anterior tutorial, solo he añadido una función, que he asignado a glutKeyboardFunc(). Esta función hará cinco cosas, que a la vez de aprender a usar el teclado para interactuar, nos enseñará dos cosas a tener en cuenta desde ahora. Explicación trás el código:

Código:
#include <GL/glut.h>

float avx = 0.05f;
float avy = 0.05f;
float xpos = -1.0f;
float ypos = 2.0f;
int ms = 20;
int acelera = 1;
float rojo, verde, azul, dis;

void IniciarGLUT() {
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowSize(600,600);
  glutInitWindowPosition(100,100);
  glutCreateWindow("Practica II,4 de OpenGL");
}
   
void PintarEscena() {
   glMatrixMode(GL_MODELVIEW);
   glClear(GL_COLOR_BUFFER_BIT);
   glLoadIdentity();
   
   glColor3f(0.0f,0.0f,0.4f);
   glRectf(-10.0f,-10.0f,10.0f,10.0f);
   
   glColor3f(0.0f,0.0f,0.0f);
   glRectf(xpos-0.5f+dis, ypos-0.5f-dis, xpos+0.5f+dis, ypos+0.5f-dis);
   
   glColor3f(rojo,verde,azul);
   glRectf(xpos-0.5f, ypos-0.5f, xpos+0.5f, ypos+0.5f);

   glutSwapBuffers();
}

void ReProyectar(int w, int h) {
   GLfloat formato;

   if(h == 0) h = 1;
      
    glViewport(0, 0, w, h);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   formato = (GLfloat)w / (GLfloat)h;
    if (w <= h) glOrtho (-10.0f, 10.0f, -10.0f / formato, 10.0f / formato, 1.0f, -1.0f);
    else glOrtho (-10.0f * formato, 10.0f * formato, -10.0f, 10.0f, 1.0f, -1.0f);
}

void Avanzar(int value) {
    xpos = xpos + avx;
    ypos = ypos + avy;
    if (xpos+0.5f>10.0f || xpos-0.5f<-10.0f) {
        avx = -avx;
        xpos = xpos + avx;
    }
    if (ypos+0.5f>10.0f || ypos-0.5f<-10.0f) {
        avy = -avy;
        ypos = ypos + avy;
    }
    if (acelera) ms++;
    else ms--;
    if (ms>60 || ms<2) acelera = !acelera;

    glutTimerFunc(ms,Avanzar,1);
    glutPostRedisplay();
}

void ControlTeclado(unsigned char key, int x, int y) {
    switch (key)
    {
            case 114:            // 114 en ASCII es: r
                if (rojo==1.0f) rojo = 0.0f;
                else rojo = 1.0f;
            break;
            case 118:            // 118 en ASCII es: v
                if (verde==1.0f) verde = 0.0f;
                else verde = 1.0f;
            break;
            case 97:            // 97 en ASCII es: a
                if (azul==1.0f) azul = 0.0f;
                else azul = 1.0f;
            break;
            case 117:            // 117 en ASCII es: u
                dis = dis + 0.1f;
                if (dis>5.0f) dis = 5.0f;
            break;
            case 106:              // 106 en ASCII es: j
                dis = dis - 0.1f;
                if (dis<0.0f) dis = 0.0f;
            break;
    }
    glutPostRedisplay();
}

int main(int argc, char **argv)
{
   glutInit(&argc,argv); //Solo necesario en Linux
  IniciarGLUT();
 
  glutReshapeFunc(ReProyectar);
  glutDisplayFunc(PintarEscena);
  glutTimerFunc(ms,Avanzar,1);
  glutKeyboardFunc(ControlTeclado);
 
  glutMainLoop();
    return 0;
}

Bueno, glutKeyboardFunc(ControlTeclado); es la novedad en main(), se activará cada vez que cambie el estado del teclado. Ésta es la función a la que alude:
Código:
void ControlTeclado(unsigned char key, int x, int y) {
    switch (key)
    {
            case 114:            // 114 en ASCII es: r
                if (rojo==1.0f) rojo = 0.0f;
                else rojo = 1.0f;
            break;
            case 118:            // 118 en ASCII es: v
                if (verde==1.0f) verde = 0.0f;
                else verde = 1.0f;
            break;
            case 97:            // 97 en ASCII es: a
                if (azul==1.0f) azul = 0.0f;
                else azul = 1.0f;
            break;
            case 117:            // 117 en ASCII es: u
                dis = dis + 0.1f;
                if (dis>5.0f) dis = 5.0f;
            break;
            case 106:              // 106 en ASCII es: j
                dis = dis - 0.1f;
                if (dis<0.0f) dis = 0.0f;
            break;
    }
    glutPostRedisplay();
}
La variable key almacena el último caracter pulsado, luego hacemos un switch (una función básica de C, que da a optar según el valor de una variable), y según cada tecla que pulses pasará una cosa.
Si pulsas r pone o quita color rojo al cuadro.
Si pulsas v pone o quita color verde al cuadro.
Si pulsas a pone o quita color azul al cuadro.
Experimenta, para mezclar los colores RGB (Red-Green-Blue), con los que se obtienen todos.
Si pulsas u acerca la falsa sombra, para semejar que el cuadrado gana altitud.
Si pulsas j aleja la falsa sombra, para semejar que el cuadrado pierde altitud.
Si lo has probado, ya habrás descubierto que si mantienes pulsada la tecla, al principio no pasa nada raro (se produce el efecto deseado) y al poco tiempo, este efecto empieza a ocurrir muchas veces por segundo. Esto pasa porque la función del teclado, detecta la tecla pulsada a través del SO, cuando escribes, si mantienes pulsada la tecla pasa lo mismo que he descrito antes. Hay un tiempo de descanso para que no se repita la tecla, pues si no lo hubiese, por muy rápido que pulses la tecla, ésta se detectará muchas veces. No me enrrollo más, que no es difícil de entender, si te interesa que desde el principio, se produzca repetición, anula el tiempo de repetición (en Windows, Panel de Control -> Teclado).

En cuanto a la tecla pulsada, en realidad son números almacenados en tipo unsigned char, puedes consultar una tabla ASCII para saber que número correspone a cada tecla. Para ir probando, ya te adelanto que ESPACIO es 32, y que los símbolos más comunes están entre 60 y 140 más o menos. Si abres un editor de texto cualquiera y pones Alt+NUMERO podrás comprobarlo. Por ejemplo pon Alt+100 sale una d.

Ya por último comentar que recomiendo poner glutPostRedisplay() para que tengo efecto visual la pulsación de la tecla.

La función del teclado, también lo es de la posición del ratón en la ventana, ya lo usaré más adelante, consulta en el sumario.

HarZe
WebMaster & Desarrollador

Cantidad de envíos : 58
Fecha de inscripción : 21/06/2009
Edad : 24

Ver perfil de usuario http://opengl-esp.superforo.net

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.