Práctica.- Eventos del Mouse
La práctica presentada a continuación pretende realizar una pequeña demostración acerca del funcionamiento del mouse mediante los métodos motion y mousebutton con los cuales es posible programar determinadas acciones mediante el clic o el deslizamiento del puntero.
El funcionamiento consiste en lo siguiente:
1. Al hacer clic en cualquier lugar de la pantalla, debe dibujarse un rectángulo.
2. al hacer clic, dejar presionado el botón y arrastrarlo sobre la pantalla, debe desplazarse el rectángulo.
El código utilizado se muestra a continuación:
---------------------------------------------------------------------------------------
#include <GL/gl.h>
#include <GL/glut.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define NP 4000
#define AGE 200
float winWid,winHeight;// Determinará el tamaño de la ventana.
float rx,ry;//Determina la posicion en la que se encuentra el puntero del raton.
void redraw( void ){//Este metodo es para dibujar el rectángulo
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,0.0);//determina el color del rectangulo a dibujar.
glRectf(-10.0+rx,-10.0+ry,10.0+rx,10.0+ry);//Dibuja un rectangulo de acierto a dos vertices dados
glutSwapBuffers();//Intercambia entre el buffer frontal y el buffer oculto
}
void motion(int x, int y){//Este método determina la posicion cuando se está moviendo el rectangulo
cerr << "motion. x:" << x << ", y:" << y << " \n";
rx = float(x);
ry = winHeight - float(y);
}
void mousebutton(int button, int state, int x, int y){//Especifica la accion cuando se presiona un clic
cerr << "mousebutton. x:" << x << ", y:" << y << " \n";
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
rx = float(x);//Obtiene la posicion en x
ry = winHeight - float(y);//Obtiene la posicion en y
redraw();//Vuelve a dibujar el rectangulo
}
}
int main(int argc, char *argv[]){
winWid = 600.0;//determina el ancho de la ventana
winHeight = 400.0;//determina el largo de la ventana.
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow(" ");
glutPositionWindow(200,100);
glutReshapeWindow(int(winWid),int(winHeight));
glClearColor(0.0,0.0,0.0,1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,winWid,0.0,winHeight, -100.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glutDisplayFunc(redraw);
glutIdleFunc(redraw);
glutMotionFunc(motion);//Esta funcion permite seguir el movimiento en la ventana
glutMouseFunc(mousebutton);//Esta funcion activa los movimientos del ratón.
glutMainLoop();
return 0;
}
---------------------------------------------------------------------------------------
Al finalizar podemos tener una secuencia de imágenes como la siguiente:
En esta secuencia de imágenes, se puede notar que en los círculos rojos se encuentran las coordenadas sobre las que hubo alguna acción con el ratón.

No hay comentarios.:
Publicar un comentario