使用过剩重启蛇游戏
Restart a snake game using glut
我使用 OpenGL 和 GLUT 编写了一个 C++ 贪吃蛇游戏。问题是我实现了一个带有 2 个按钮的小菜单:新游戏,退出。我在 "new game" 部分遇到了困难。我一直在这里和那里移动代码行,但我不知道它应该如何。主要看起来像这样:
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 语句中,它可以工作,但我必须调整 window 的大小才能进行重绘(我意识到发生这种情况是因为 MainLoop 需要一个事件,但我不知道如何解决这个问题)。如果我保持这种方式,它不会改变任何事情,只会变得更糟。我是新手,很难弄清楚它是如何工作的。
如果有人遇到同样的问题,我就是这样解决的:
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() 函数保持不变。
我使用 OpenGL 和 GLUT 编写了一个 C++ 贪吃蛇游戏。问题是我实现了一个带有 2 个按钮的小菜单:新游戏,退出。我在 "new game" 部分遇到了困难。我一直在这里和那里移动代码行,但我不知道它应该如何。主要看起来像这样:
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 语句中,它可以工作,但我必须调整 window 的大小才能进行重绘(我意识到发生这种情况是因为 MainLoop 需要一个事件,但我不知道如何解决这个问题)。如果我保持这种方式,它不会改变任何事情,只会变得更糟。我是新手,很难弄清楚它是如何工作的。
如果有人遇到同样的问题,我就是这样解决的:
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() 函数保持不变。