2015-10-26 3 views
0

Я написал C++ змею с использованием OpenGL и GLUT. Проблема в том, что я реализовал небольшое меню с двумя кнопками: новая игра, выход. Мне сложно с частью «новой игры». Я двигал здесь и там строки кода, и я не знаю, как это должно быть. Основное выглядит следующим образом:Перезапустите игру змеи, используя перегиб

int main(int argc, char** argv) { 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
glutInitWindowSize(800, 600); 
glutInitWindowPosition(100, 100); 
glutCreateWindow("Aarghhh! O ramaaa !"); 
createMenu();  
glClearColor(0.0, 0.0, 0.0, 0.0); 
glutIdleFunc(display_menu); 
init(); 
glutReshapeFunc(reshape); 
glutDisplayFunc(dreptunghi); 
glutSpecialFunc(player); 
glutMainLoop(); 
return 0; 
} 

где первонач CreateMenu и display_menu выглядеть следующим образом:

void init(void) { 
    glClearColor(1.0, 1.0, 1.0, 0.0); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0, 800.0, 0.0, 600.0); 
    glShadeModel(GL_FLAT); 
} 

void menu(int num) { 
    if (num == 0) 
     exit(0); 
    else { 
     if (num == 1) { 
      menu_value = num;   
     } 
    } 

    //glutPostRedisplay(); 
} 

void createMenu(void) { 
    glutCreateMenu(menu); 
    glutAddMenuEntry("New game!", 1); 
    glutAddMenuEntry("Exit", 0);  
    glutAttachMenu(GLUT_RIGHT_BUTTON); 
} 

void display_menu(void){ 
    if (menu_value == 1) { 
     snake.clear(); 
     i = 30.0; 
     j = 30.0; 
     alpha = 1.0; 
     value = -1; 
     speed = 3; 
     eaten = true; 
     collided_food = false; 
     collided_self = false; 

     createMenu(); 
     glClearColor(0.0, 0.0, 0.0, 0.0); 
     glutIdleFunc(display_menu); 

     init(); 
     glutDisplayFunc(dreptunghi); 
     glutReshapeFunc(reshape); 
     glutSpecialFunc(player); 
     //glutMainLoop(); 
    } 
    glutSwapBuffers(); 
} 

Дело в том: если поместить содержание display_menu внутри если заявление от функции меню, она работает , но мне нужно изменить размер окна для повторной перерисовки (я понял, что это происходит, потому что MainLoop ожидает событие, но я понятия не имею, как победить это). Если я сохраню это таким образом, это ничего не изменит к добру, только к худшему. Я новичок в этом, и у меня возникают проблемы с выяснением того, как это работает.

+0

Hi. Не редактируйте вопрос, чтобы включить ответ, который вы нашли (или любой ответ на этот вопрос). Вместо этого вы должны ответить на свой вопрос (если это действительно рекомендуется), а затем вы можете даже принять его. – bolov

+0

@bolov Я сделал, как вы сказали. Спасибо за ответ! –

ответ

0

Если кто-то имеет такую ​​же проблему, это то, как я ее решил:

void menu(int num) { 
if (num == 0) { 
    if (engine) 
     engine->drop(); 
    exit(0); 
} 
else { 
    if (num == 1) { 
     menu_value = num; 
     snake.clear(); 
     i = 30.0; 
     j = 30.0; 
     nou.set(i, j); 
     snake.push_back(nou); 
     alpha = 1.0; 
     value = -1; 
     speed = 3; 
     eaten = true; 
     collided_food = false; 
     collided_self = false; 

     createMenu(); 
     glClearColor(0.0, 0.0, 0.0, 0.0); 

     glClearColor(1.0, 1.0, 1.0, 0.0); 
     glutDisplayFunc(dreptunghi); 
     glutReshapeFunc(reshape); 
     glutSpecialFunc(player); 
    } 
} 
glutSwapBuffers(); 
glutPostRedisplay(); 
} 

в то время как функция инициализации() остается неизменным.