Título: SubMenus en Open gl Publicado por: V_Dan en 31 Agosto 2012, 06:06 am Hola!!
Lo que pasa es que estoy haciendo un Menú en Opengl Debe en una opción reiniciarse, cambiar color de fondo y 3 salir 1.Pero es de un trique y cuando se reinicia no quiero que se borre todo (Mi cuadricula) entonces no le pondría la de GL_CLEAR 2. No se muy bien manejar los submenus, entonces no se como hacer que cambie el color de fondo Entonces necesito no se asesoría al respecto, por que cuando le doy reiniciar me termina saliendo color :( Aquí les dejo el Programa, quizá tengan alguna idea y Agradezco su Ayuda! :) #include <iostream> #include <GL/glut.h> #include <math.h> using namespace std; int matrizDatos[3][3]={-1,-1,-1,-1,-1,-1,-1,-1,-1}; void verificar(); int figura = 0; void menutriqui(int); void init(void) { glClearColor(0.0,0.0,0.0,0.0); glMatrixMode(GL_PROJECTION); //establece los parámetros de proyeccion gluOrtho2D(0.0,500.0,0.0,500.0); figura = 0; int submenu1; submenu1=glutCreateMenu(menutriqui); glutAddMenuEntry("Un Color", 3); glutAddMenuEntry("Otro Color", 4); glutAddMenuEntry("Tercer Color", 5); glutCreateMenu(menutriqui); glutAddMenuEntry("Reiniciar",1); glutAddSubMenu("Color de Fondo",submenu1); glutAddMenuEntry("Salir",2); glutAttachMenu(GLUT_RIGHT_BUTTON); } void lineSegment(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); //borra la ventana de visualización glColor3f(0.0,1.0,0.0); //establece el color del segmento de línea glBegin(GL_LINES); glVertex2i(200,100); //especifica la geometria del segmento de línea glVertex2i(200,400); glVertex2i(300,100); //especifica la geometria del segmento de línea glVertex2i(300,400); glVertex2i(100,200); //especifica la geometria del segmento de línea glVertex2i(400,200); glVertex2i(100,300); //especifica la geometria del segmento de línea glVertex2i(400,300); glEnd(); glFlush(); } void imprimirMatriz() { for(int i=0;i<3;i++) { for(int j=0; j<3; j++) cout<<matrizDatos[j]<<", "; cout<<endl; } } void clic(int button, int state, int x, int y ) // Eventos del Mouse { if(state==GLUT_UP)return; int col, row; y = 500 -y; if((x>100)&&(x<200)) col=0; else if((x>200)&&(x<300)) col=1; else if((x>300)&&(x<400)) col=2; else return; if((y>100)&&(y<200)) row=0; else if((y>200)&&(y<300)) row=1; else if((y>300)&&(y<400)) row=2; else return; int coordX = 150 + 100*col; int coordY = 150 + 100*row; if(figura == 0 && matrizDatos[row][col]==-1) { matrizDatos[row][col]=0; glColor3f(0.1f,0.1f,0.1f); figura = 1; glBegin(GL_LINES); glVertex2i(coordX - 40 ,coordY -40); //especifica la geometria del segmento de línea glVertex2i(coordX + 40 ,coordY +40); glVertex2i(coordX - 40 ,coordY +40); //especifica la geometria del segmento de línea glVertex2i(coordX + 40 ,coordY -40); glEnd(); figura=1; } if (figura == 1 &&matrizDatos[row][col]==-1) { matrizDatos[row][col]=1; glColor3f(0.0f,0.0f,1.0f); figura = 0; glBegin(GL_LINE_LOOP); glVertex2f(coordX - 40 ,coordY -40); glVertex2f(coordX + 40 ,coordY -40); glVertex2f(coordX ,coordY +40); figura=0; } glEnd(); glFlush(); verificar(); imprimirMatriz(); } void verificar(void)//FUNCION VERIFICAR { if (matrizDatos[0][0]==0 && matrizDatos[1][0]== 0 &&matrizDatos[2][0]==0 ||matrizDatos[0][0]==1 && matrizDatos[1][0]== 1 &&matrizDatos[2][0]==1 ) { glBegin(GL_LINES); glColor3f(0.0f,0.0f,1.0f); glVertex2i(150,100); glVertex2i(150,400); glEnd(); glFlush(); figura=3; cout<<"GANASTE"; } else if (matrizDatos[0][1]==0 &&matrizDatos[1][1]==0 &&matrizDatos[2][1]==0 || matrizDatos[0][1]==1 &&matrizDatos[1][1]==1 &&matrizDatos[2][1]==1) { glBegin(GL_LINES); glColor3f(0.0f,0.0f,1.0f); glVertex2i(250,100); glVertex2i(250,400); glEnd(); glFlush(); figura=3; cout<<"GANASTE"; } else if (matrizDatos[0][2]==0 &&matrizDatos[1][2]==0 &&matrizDatos[2][2]==0 || matrizDatos[0][2]==1 &&matrizDatos[1][2]==1 &&matrizDatos[2][2]==1) { glBegin(GL_LINES); glColor3f(0.0f,0.0f,1.0f); glVertex2i(350,100); glVertex2i(350,400); glEnd(); glFlush(); figura=3; cout<<"GANASTE"; } else if (matrizDatos[0][0]==0 &&matrizDatos[0][1]==0 &&matrizDatos[0][2]==0 || matrizDatos[0][0]==1 &&matrizDatos[0][1]==1 &&matrizDatos[0][2]==1) { glBegin(GL_LINES); glColor3f(0.0f,0.0f,1.0f); glVertex2i(100,150); glVertex2i(400,150); glEnd(); glFlush(); figura=3; cout<<"GANASTE"; } else if (matrizDatos[1][0]==0 &&matrizDatos[1][1]==0 &&matrizDatos[1][2]==0 || matrizDatos[1][0]==1 &&matrizDatos[1][1]==1 &&matrizDatos[1][2]==1) { glBegin(GL_LINES); glColor3f(0.0f,0.0f,1.0f); glVertex2i(100,250); glVertex2i(400,250); glEnd(); glFlush(); figura=3; cout<<"GANASTE"; } else if (matrizDatos[2][0]==0 &&matrizDatos[2][1]==0 &&matrizDatos[2][2]==0 || matrizDatos[2][0]==1 &&matrizDatos[2][1]==1 &&matrizDatos[2][2]==1) { glBegin(GL_LINES); glColor3f(0.0f,0.0f,1.0f); glVertex2i(100,350); glVertex2i(400,350); glEnd(); glFlush(); figura=3; cout<<"GANASTE"; } else if(matrizDatos[0][0]==0 &&matrizDatos[1][1]==0 &&matrizDatos[2][2]==0 || matrizDatos[0][0]==1 &&matrizDatos[1][1]==1 &&matrizDatos[2][2]==1)//verificar diagonal 1 { glBegin(GL_LINES); glColor3f(0.0f,0.0f,1.0f); glVertex2i(100,100); glVertex2i(400,400); glEnd(); glFlush(); figura=3; cout<<"GANASTE"; } else if(matrizDatos[0][2]==0 && matrizDatos[1][1]==0 && matrizDatos[2][0]==0 || matrizDatos[0][2]==1 &&matrizDatos[1][1]==1 &&matrizDatos[2][0]==1)//verificar diagonal 2 { glBegin(GL_LINES); glColor3f(0.0f,0.0f,1.0f); glVertex2i(400,100); glVertex2i(100,400); glEnd(); glFlush(); figura=3; cout<<"GANASTE"; } } void menutriqui(int value) // Menutriqui { if(value==1) glutPostRedisplay; if(value==2) exit(0); if(value==3) glClearColor(1.0f,1.0f,1.0f,1.0f ); if(value==4) glClearColor(1.0f,0.0f,1.0f,0.0f ); if(value==5) glClearColor(0.0f,1.0f,0.0f,1.0f ); } int main (int argc,char** argv) { glutInit(&argc,argv); //Inicializa GLUT glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //establece el modo de visualizacion glutInitWindowPosition(50,100); //establece la posicion de la esquina superior //izquierda de la ventana de visualizacion glutInitWindowSize(500,500); //establece el ancho y la altura de la ventana //de visualizacion glutCreateWindow("Triqui"); //crea la ventana de visualizacion init(); //ejecuta el procedimiento de inicializacion glutMouseFunc(clic); glutDisplayFunc(lineSegment);//envia los graficos a la ventana de visualizacion glutMainLoop(); //muestra todo y espera } Título: Re: SubMenus en Open gl Publicado por: BlackZeroX en 31 Agosto 2012, 06:25 am Por lo que veo estas en C++ así que mejor créate alguna clase para dibujar texturas, otra para manipular texto, otra para detectar eventos de entradas (mouse y teclado) otra clase para que sirva de contenedor en 2D y te ordene cada elemento según coordenadas X,Y y de manera opcional una clase que sea para reproducir animaciones (por ejemplo reproducir un hundimiento de un botón al dar click), etc... de esta manera lo que haces estará mas ordenado y podrás crear tantas cosas que te darán riza la facilidad con la que los creas (obviamente deberán estar bien desmenuzado lo que deseas hacer).
Cuando tengas estas clases puedes asociarlas y crear: -> Menús. -> Ventanas de dialogo. -> Etc... Esto te lo menciono por que en la manera en la que lo estas asiendo es desastrosa a FUTURO y en su dinamismo de modelado posterior. Dulces Lunas!¡. |