SubMenus en Open gl

Iniciado por V_Dan, 31 Agosto 2012, 06:06 AM

0 Miembros y 1 Visitante están viendo este tema.

V_Dan

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
   
}


BlackZeroX

#1
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!¡.
The Dark Shadow is my passion.