[Tutorial] II.6 - glutMouseFunc()

Ver el tema anterior Ver el tema siguiente Ir abajo

[Tutorial] II.6 - glutMouseFunc()

Mensaje  HarZe el Mar Jul 28, 2009 3:05 pm

II.6 Recoge los datos del ratón: glutMouseFunc()
Novedades:
  • glutMouseFunc()


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

float xpos, ypos;
float rojo, verde, azul, dis;

void IniciarGLUT() {
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowSize(600,600);
  glutInitWindowPosition(100,100);
  glutCreateWindow("Practica II,6 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 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 98:            // 98 en ASCII es: b
                if (azul==1.0f) azul = 0.0f;
                else azul = 1.0f;
            break;
    }
    glutPostRedisplay();
}

void ControlFlechas(int key, int x, int y) {
    switch (key)
    {
            case GLUT_KEY_RIGHT:
                xpos = xpos + 0.08f;
                if (xpos > 10.0f-0.5f) xpos = 9.5f;
            break;
            case GLUT_KEY_LEFT:
                xpos = xpos - 0.08f;
                if (xpos < -10.0f+0.5f) xpos = -9.5f;
            break;
            case GLUT_KEY_UP:
                ypos = ypos + 0.08f;
                if (ypos > 10.0f-0.5f) ypos = 9.5f;
            break;
            case GLUT_KEY_DOWN:
                ypos = ypos - 0.08f;
                if (ypos < -10.0f+0.5f) ypos = -9.5f;
            break;
    }
    glutPostRedisplay();
}

void ControlRaton(int button, int state, int x, int y) {
    if (button==GLUT_LEFT_BUTTON && state==GLUT_UP) {
        dis = dis + 0.1f;
        if (dis > 50.0f) dis = 50.0f;
    }
    if (button==GLUT_RIGHT_BUTTON && state==GLUT_UP) {
        dis = dis - 0.1f;
        if (dis < 0.0f) dis = 0.0f;
    }
    glutPostRedisplay();
}

int main(int argc, char **argv)
{
   glutInit(&argc,argv); //Solo necesario en Linux
  IniciarGLUT();
 
  glutReshapeFunc(ReProyectar);
  glutDisplayFunc(PintarEscena);
  glutSpecialFunc(ControlFlechas);
  glutKeyboardFunc(ControlTeclado);
  glutMouseFunc(ControlRaton);
 
  glutMainLoop();
    return 0;
}

Cuando se producen cambios en el ratón se acude a la función asignada en glutMouseFunc(ControlRaton);, esa función acude a esta:
Código:
void ControlRaton(int button, int state, int x, int y) {
    if (button==GLUT_LEFT_BUTTON && state==GLUT_UP) {
        dis = dis + 0.1f;
        if (dis > 50.0f) dis = 50.0f;
    }
    if (button==GLUT_RIGHT_BUTTON && state==GLUT_UP) {
        dis = dis - 0.1f;
        if (dis < 0.0f) dis = 0.0f;
    }
    glutPostRedisplay();
}
En otra palabras, si el cambio es en el click izquierdo, y ese cambio es que se levanta (tras haber sido pulsado). Si eso pasa, la sombra se aleja. Si todo esto sucede con el click derecho, se acerca la sombra.
También puedes acudir a GLUT_MIDDLE_BUTTON, los estados son GLUT_UP y GLUT_DOWN, también podrás interactuar con la posición del ratón (int x,int y). El resto es tu imaginación, pero de todas formas, más adelante lo usaremos, asi que si buscas ejemplos que usen esta función (y también las de teclado) te hartarás, ya que en los futuros ejemplos casi siempre usaré controles.

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.