使用过剩重启蛇游戏

时间:2015-10-26 15:01:31

标签: c++ opengl glut

我使用OpenGL和GLUT编写了一个c ++蛇游戏。问题是我实现了一个小菜单,有2个按钮:新游戏,退出。我在“新游戏”部分遇到了困难。我一直在这里和那里移动代码行,我不知道它应该如何。 Main看起来像这样:

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;
}

其中init,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的内容放在菜单函数的if语句中,它可以正常工作,但是我必须调整窗口大小才能重绘(我意识到这是因为MainLoop需要一个事件,但是我不知道怎么打败这个)。如果我保持这种方式,它不会改变任何东西,只会变得更糟。我是新手,我很难找到它是如何工作的。

1 个答案:

答案 0 :(得分: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();
}

而init()函数保持不变。