Я написал 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 ожидает событие, но я понятия не имею, как победить это). Если я сохраню это таким образом, это ничего не изменит к добру, только к худшему. Я новичок в этом, и у меня возникают проблемы с выяснением того, как это работает.
Hi. Не редактируйте вопрос, чтобы включить ответ, который вы нашли (или любой ответ на этот вопрос). Вместо этого вы должны ответить на свой вопрос (если это действительно рекомендуется), а затем вы можете даже принять его. – bolov
@bolov Я сделал, как вы сказали. Спасибо за ответ! –