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
}