PMG

Форумы по созданию игр
Текущее время: 24 апр 2024 07:55

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Как закрыть Glut-окно???
СообщениеДобавлено: 11 апр 2005 18:07 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 09 окт 2004 17:19
Сообщения: 22
Откуда: Ostrava
Не могу закрыть Glut-окно :cry:
Создаю два окна. Во втором окне создаю кнопку, по нажатии на которую должно закрываться это(второе) окно.
Пытаюсь ф-цией glutDestroyWindow(2)
Выскакивает ошибка:
Unhandled exception in new cross.exe (GLUT.DLL): 0xC0000005: Access Violation.
Если писать glutDestroyWindow(1) то спокойно и без ошибок закрывается первое окно.
Окно в полноэкранном режима, поэтому на крестик нажать не получится, а окно мне нужно в полноэкранном режиме.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 апр 2005 08:47 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
А почему 1 и 2 в функции glutDestroyWindow? Там же вроде надо числа полученные из функции glutCreateWindow?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 апр 2005 09:30 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 09 окт 2004 17:19
Сообщения: 22
Откуда: Ostrava
Так ведь это они и есть.
Если проверить функцией int glutGetWindow(void); , то первое окно с индексом 1, а второе с индексом 2.
И ведь первое окно закрывается.
И если функцию закрытия поместить в первое окно( где одна кнопка, которая показывает уже созданное, но скрытое второе окно), на ту же кнопку, то первое окно спокойно закрывается, показывается второе. Но если удалить код, который показывает второе окно, появляется та же ошибка :(
Или может я как не так закрываю, может есть какие другие способы?

_________________
Самым большим доказательством существования разумной жизни во Вселенной является тот факт, что до сих пор никто не попытался с нами связаться 8)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 апр 2005 09:36 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 09 окт 2004 17:19
Сообщения: 22
Откуда: Ostrava
Вот код.
Код:
#include "glut.h"
#include <stdlib.h>
double memorkoord;
char koordin[]="";

void draw_string(void *font, const char* string)
{int i(0),k(0),t(0);
   while(string[k]!=NULL)
   {
      if(string[k++]=='.')
      {
         t=1;
          break;
      }
   }
  while((i++)<5+t)
    glutStrokeCharacter(font, *string++);
}

#include "window_0.h"
#include "window_1.h"

void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(500, 400);
glutInitWindowPosition(0, 0);
glutCreateWindow("New Cross");
glClearColor(0.0, 0.0, 0.0, 0.0);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutFullScreen();


glutInitWindowSize(800, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("OKHO");
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse1);
glutReshapeFunc(reshape1);
glutDisplayFunc(display1);
glutFullScreen();
glutHideWindow();

glutMainLoop();
}


теперь window_0.h
Код:
void DrawButton(GLenum mode)
{
     GLuint i, j;
for (i=0; i<3; i++){
    if(mode==GL_SELECT)
      glLoadName(i);
   for(j=0; j<3; j++){
        if(mode==GL_SELECT)
          glPushName(j);
       if(i==0 && j==1)
         {
            glBegin(GL_QUADS);
               glVertex3f(200.0, 200.0, 0.0);
                 glVertex3f(300.0, 200.0, 0.0);
                  glVertex3f(300.0, 400.0, 0.0);
                    glVertex3f(200.0, 400.0, 0.0);
                glEnd();
         }
       if (mode==GL_SELECT)
          glPopName();
   }
}
}

void processHits(GLint hits, GLuint buffer[])
{
unsigned int i, j;
GLuint ii,jj, names, *ptr;
ptr=(GLuint *) buffer;
     for (i=0; i<hits; i++){
          names=*ptr;
        ptr++; ptr++; ptr++;
        for(j=0;j<names; j++){
        if (j==0)
           ii= *ptr;
        else if(j==1)
           jj= *ptr;
        ptr++;
        }
        if(ii==0 && jj==1)
        {   glutDestroyWindow(1);
         glutSetWindow(2);
         glutShowWindow();
        }
       
    }

}
#define BUFSIZE 512
void mouse(int button, int state, int x, int y)
{
  GLuint selectBuf[BUFSIZE];
   GLint hits;
   GLint viewport[4];
   if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN)
      return;
   glGetIntegerv (GL_VIEWPORT, viewport);
   glSelectBuffer (BUFSIZE, selectBuf);
   (void) glRenderMode(GL_SELECT);
   glInitNames();
   glPushName(0);
   glMatrixMode (GL_PROJECTION);
   glPushMatrix ();
    glLoadIdentity ();
   gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] - y), 0.1, 0.1, viewport);
      glOrtho(0.0, 800.0, 0.0, 800.0, -1000.0, 1000.0);
   DrawButton(GL_SELECT);
   glMatrixMode(GL_PROJECTION);
   glPopMatrix();
   glFlush();

   hits=glRenderMode(GL_RENDER);
   processHits(hits, selectBuf);
   glutPostRedisplay();
}

void keyboard(unsigned char key, int x, int y)
{
       switch (key)
      {
       case 27:
         exit(0);
         break;
      default:
         break;
      }
}

void display(void)
{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glColor3f(1.0, 1.0, 1.0);
DrawButton(GL_RENDER);
glutSwapBuffers(); 
glFlush();
}

void reshape(int w, int h)
{
     glViewport(0, 0, w, h);
     glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
     glOrtho(0.0, w, 0.0, w, -10000.0, 10000.0);
     glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
}


Теперь "window_1.h"
Код:
char koord[5]="";
char number[]="0";
char plus[1]={'+'};

void DrawButton1(GLenum mode)
{
     GLuint i, j;
for (i=0; i<3; i++){
    if(mode==GL_SELECT)
      glLoadName(i);
   for(j=0; j<5; j++){
        if(mode==GL_SELECT)
          glPushName(j);
       if(i==0 && j==0)
         {
         glBegin(GL_QUADS);
glColor3f(1.0, 0.0, 0.0);
  glVertex2f(0.0f, 0.0f);
  glVertex2f(1.0f, 0.0f);
  glVertex2f(1.0f, 2.0f);
  glVertex2f(0.0f, 2.0f);
  glEnd();   
         }
       if(i==0 && j==1)
       {
         glBegin(GL_QUADS);
glColor3f(0.0, 1.0, 0.0);
  glVertex2f(1.0f, 0.0f);
  glVertex2f(2.0f, 0.0f);
  glVertex2f(2.0f, 2.0f);
  glVertex2f(1.0f, 2.0f);
  glEnd();
       }
       if(i==0 && j==2)
       {
         glBegin(GL_QUADS);
glColor3f(0.0, 0.0, 1.0);
  glVertex2f(2.0f, 0.0f);
  glVertex2f(3.0f, 0.0f);
  glVertex2f(3.0f, 2.0f);
  glVertex2f(2.0f, 2.0f);
  glEnd();
       }
       if(i==0 && j==3)
       {
        glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 0.0);
  glVertex2f(3.0f, 0.0f);
  glVertex2f(4.0f, 0.0f);
  glVertex2f(4.0f, 2.0f);
  glVertex2f(3.0f, 2.0f);
  glEnd();
       }
       if(i==0 && j==4)
       {
       glBegin(GL_QUADS);
glColor3f(0.0, 1.0, 1.0);
  glVertex2f(4.0f, 0.0f);
  glVertex2f(5.0f, 0.0f);
  glVertex2f(5.0f, 2.0f);
  glVertex2f(4.0f, 2.0f);
  glEnd();
       }
       if(i==1 && j==0)
       {
           glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0);
  glVertex2f(0.0f, 2.0f);
  glVertex2f(1.0f, 2.0f);
  glVertex2f(1.0f, 4.0f);
  glVertex2f(0.0f, 4.0f);
  glEnd();
       }
       if(i==1 && j==1)
       {
         glBegin(GL_QUADS);
glColor3f(0.5f, 0.0f, 1.0f);
  glVertex2f(1.0f, 2.0f);
  glVertex2f(2.0f, 2.0f);
  glVertex2f(2.0f, 4.0f);
  glVertex2f(1.0f, 4.0f);
  glEnd();
       }
       if(i==1 && j==2)
       {
         glBegin(GL_QUADS);
glColor3f(0.0f, 0.5f, 0.0f);
  glVertex2f(2.0f, 2.0f);
  glVertex2f(3.0f, 2.0f);
  glVertex2f(3.0f, 4.0f);
  glVertex2f(2.0f, 4.0f);
  glEnd();
       }
       if(i==1 && j==3)
       {
          glBegin(GL_QUADS);
glColor3f(0.5f, 0.5f, 0.5f);
  glVertex2f(3.0f, 2.0f);
  glVertex2f(4.0f, 2.0f);
  glVertex2f(4.0f, 4.0f);
  glVertex2f(3.0f, 4.0f);
  glEnd();
       }
       if(i==1 && j==4)
       {
          glBegin(GL_QUADS);
glColor3f(1.0f, 0.5f, 1.0f);
  glVertex2f(4.0f, 2.0f);
  glVertex2f(5.0f, 2.0f);
  glVertex2f(5.0f, 4.0f);
  glVertex2f(4.0f, 4.0f);
  glEnd();
       }
       if(i==2 && j==0)
       {
          glBegin(GL_QUADS);
glColor3f(0.5f, 0.2f, 0.8f);
  glVertex2f(0.0f, 4.0f);
  glVertex2f(1.0f, 4.0f);
  glVertex2f(1.0f, 6.0f);
  glVertex2f(0.0f, 6.0f);
  glEnd();
       }
       if(i==2 && j==1)
       {
         glBegin(GL_QUADS);
glColor3f(0.0f, 0.1f, 0.5f);
  glVertex2f(1.0f, 4.0f);
  glVertex2f(2.0f, 4.0f);
  glVertex2f(2.0f, 6.0f);
  glVertex2f(1.0f, 6.0f);
  glEnd();
       }
       if(i==2 && j==2)
       {
          glBegin(GL_QUADS);
glColor3f(0.1f, 0.8f, 0.2f);
  glVertex2f(2.0f, 4.0f);
  glVertex2f(3.0f, 4.0f);
  glVertex2f(3.0f, 6.0f);
  glVertex2f(2.0f, 6.0f);
  glEnd();
       }
       if(i==2 && j==3)
       {
       glBegin(GL_QUADS);
glColor3f(0.8f, 0.5f, 0.2f);
  glVertex2f(3.0f, 4.0f);
  glVertex2f(4.0f, 4.0f);
  glVertex2f(4.0f, 6.0f);
  glVertex2f(3.0f, 6.0f);
  glEnd();
       }
       if(i==2 && j==4)
       {
           glBegin(GL_QUADS);
glColor3f(0.2f, 0.5f, 0.8f);
  glVertex2f(4.0f, 4.0f);
  glVertex2f(5.0f, 4.0f);
  glVertex2f(5.0f, 6.0f);
  glVertex2f(4.0f, 6.0f);
  glEnd();
       }
      if(mode==GL_SELECT)
         glPopName();
   }
}
}


void processHits1(GLint hits, GLuint buffer[])
{

unsigned int i, j;
GLuint ii,jj, names, *ptr;
ptr=(GLuint *) buffer;
     for (i=0; i<hits; i++){
          names=*ptr;
        ptr++; ptr++; ptr++;
        for(j=0;j<names; j++){
        if (j==0)
           ii= *ptr;
        else if(j==1)
           jj= *ptr;
        ptr++;
        }
        if(ii==0 && jj==0)
        {  int h;
        h=glutGetWindow();
           *plus='+';
        }
        if(ii==0 && jj==1)
        {
           *plus='-';
        }
        if(ii==0 && jj==2)
        {
           number[0]='.';
           strcat(koord, number);
        }
        if(ii==0 && jj==3)
        {
             strcat(koordin, plus);
          strcat(koordin, koord);
       memorkoord=atof(koordin);
     [color=blue]        [size=18]glutDestroyWindow(2);[/[/size]color]
          *plus='+';
          *koord=' ';
          *number='0';

        }
        if(ii==0 && jj==4)
        {
               
        }
        if(ii==1 && jj==0)
        {
           number[0]='0';
           strcat(koord, number);

        }
        if(ii==1 && jj==1)
        {
           number[0]='1';
           strcat(koord, number);
        }
        if(ii==1 && jj==2)
        {
           number[0]='2';
           strcat(koord, number);
        }
        if(ii==1 && jj==3)
        {
           number[0]='3';
           strcat(koord, number);
        }
        if(ii==1 && jj==4)
        {
           number[0]='4';
           strcat(koord, number);
        }
        if(ii==2 && jj==0)
        {
           number[0]='5';
           strcat(koord, number);
        }
        if(ii==2 && jj==1)
        {
           number[0]='6';
           strcat(koord, number);
        }
        if(ii==2 && jj==2)
        {
           number[0]='7';
           strcat(koord, number);
        }
        if(ii==2 && jj==3)
        {
           number[0]='8';
           strcat(koord, number);
        }
        if(ii==2 && jj==4)
        {
           number[0]='9';
           strcat(koord, number);
        }
       
    }
   
}


#define BUFSIZE 512
void mouse1(int button, int state, int x, int y)
{
  GLuint selectBuf[BUFSIZE];
   GLint hits;
   GLint viewport[4];
   if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN)
      return;
   glGetIntegerv (GL_VIEWPORT, viewport);
   glSelectBuffer (BUFSIZE, selectBuf);
   (void) glRenderMode (GL_SELECT);
   glInitNames();
   glPushName(0);
   glMatrixMode (GL_PROJECTION);
   glPushMatrix ();
    glLoadIdentity ();
   gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] - y), 0.1, 0.1, viewport);
      gluOrtho2D(0.0, 5.0, 0.0, 10.0);
   DrawButton1(GL_SELECT);
   glMatrixMode(GL_PROJECTION);
   glPopMatrix();
   glFlush();

   hits=glRenderMode(GL_RENDER);
   processHits1(hits, selectBuf);
   glutPostRedisplay();
}

void display1(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  DrawButton1(GL_RENDER);
    glLineWidth(1);
  glPushMatrix();
      glTranslatef(2.5f, 8.0f, 0.0f);
      glColor3f(1.0f, 1.0f, 0.0f);
      glScalef(0.006f, 0.006f, 0.006f);
         draw_string(GLUT_STROKE_ROMAN, koord);
   glPopMatrix();
   glPushMatrix();
      glTranslatef(2.0f, 8.2f, 0.0f);
      glScalef(0.003f, 0.003f, 0.003f);
         draw_string(GLUT_STROKE_ROMAN, plus);
   glPopMatrix();

  glutSwapBuffers(); 
glFlush();
}

void reshape1(int w, int h)
{
     glViewport(0, 0, w, h);
     glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
     gluOrtho2D(0.0, 5.0, 0.0, 10.0);
     glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 апр 2005 10:02 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Номера 1 и 2 могут не всегда быть такими, во всех системах. Лучше запоминать числа, которые дает glutCreate Window.

Ошибка выскакивает во время какой функции? glutDestroyWindow(2)? Мне кажется эту команду надо вызывать в конце main.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 апр 2005 14:51 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 09 окт 2004 17:19
Сообщения: 22
Откуда: Ostrava
Цитата:
Номера 1 и 2 могут не всегда быть такими, во всех системах. Лучше запоминать числа, которые дает glutCreate Window.

Попробовал сделать так. Все равно те же цифры и та же ошибка.
Цитата:
Ошибка выскакивает во время какой функции? glutDestroyWindow(2)?

Да, во время этой функции.
Цитата:
Мне кажется эту команду надо вызывать в конце main.

Почему в конце main? Я ведь пытаюсь закрыть окно по нажатии на кнопку. У меня закрытие окна - не выход из программы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 13 апр 2005 08:37 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Лёха писал(а):
Почему в конце main? Я ведь пытаюсь закрыть окно по нажатии на кнопку. У меня закрытие окна - не выход из программы.


Но ведь ты вызываешь это из функции mouse1, которая задана обработчиком glutMouseFunc(mouse1) для окна glutCreateWindow("OKHO"). Возможно из-за этого! Надо проверить!

Потом попробуй убрать все лишнее из функции processHits1 и посмотреть - может что-то до вызова glutDestroyWindow(2) портит память. Например, strcat(koordin, plus); strcat(koordin, koord);

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB