Ver Mensaje Individual
  #5 (permalink)  
Antiguo 23/10/2008, 09:24
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema, opengl, Glut y Rubberband

Tienes 2 formas de hacerlo, según quieras que se maneje.

1. Si lo que quieres es que haya que hacer: aprieto el botón, arrastro, suelto el botón.

2. Si lo que quieres que haya que hacer es: aprieto y suelto el botón, muevo el ratón, aprieto y suelto el botón.


Lo que tú dices parece lo segundo, pero lo que hace el Paint es lo primero. Aprietas, arrastras y cuando sueltas se hace el rectángulo. Así que me voy a centrar en ese caso.


Una cosa que debes hacer en cualquier caso es guardar el primer punto. Ya luego, cuando se mueva el ratón, tienes que recordar desde dónde se hacía el rectángulo.

Entonces, el procedimiento podría ser algo así:

0. En lugar de moving, usaré pulsado, que me parece mejor nombre. Además, harán falta otras dos variables (x0, y0) que serán dodne guarde el primer punto.

1. mouse (parte 1):
Código:
si (GLUT_DOWN) entonces {
    pulsado = 1; // El botón está pulsado
    x0 = x; // Guardamos el punto donde se pulsó el botón
    y0 = y;
}
2. En lugar de glutPassiveMotionFunc a lo que hay que llamar es a glutMotionFunc y la función de callback que le pasamos la llamaremos mousedrag, que me gusta más el nombre.
En esa función básicamente llamamos a drawSquare(x0,y0,x,y). Es decir, con los dos puntos, el inicial y el actual.
Código:
void mousedrag(int x, int y) {
    drawSquare(x0,y0,x,y);
}
3. En drawSquare en lugar de tener que calcular el tamaño y luego hacer los vértices con el tamaño calculado, lo que hacemos es más simple, tenemos todos los vértices.

Código:
    //...
    glVertex2i(x0, y0);
    glVertex2i(x0, y);
    glVertex2i(x, y0);
    glVertex2i(x, y);
    //...
Aunque si no recuerdo mal, las Y van invertidas, no? Vamos que igual lo que tienes que hacer es más bien (x0,(h-y0)), (x0,(h-y)), etc

4. mouse (parte 2)
Cuando sea GLUT_UP entonces ponemos pulsado = 0




Hasta aquí sería un sistema muy básico. Si lo pruebas, verás que tiene un problema, no borra los rectángulos que se pintan al arrastrar. Es decir, se pintan un montón de rectángulos según arrastras el ratón.


¿Qué hay que hacer para solucionar esto? Hay varias soluciones, claro. Lo más chapuza sería ir recordando también el punto anterior y borrando el rectángulo anterior antes de pintar el nuevo. Ve probando a hacer eso y luego piensa mejores soluciones (como utilizar un buffer de objetos y tener algunos fijos y otros temporales...).