PAOGD_HW4
任务介绍
- 贪吃蛇游戏:玩家控制贪吃蛇在游戏区域里驰骋,避免碰到自己或障碍物,尽可能地吃更多的食物以生长!
游戏玩法:
- WASD控制蛇的移动
- 游戏开始,每隔一定时间会在地图空闲位置刷新一个食物,蛇触碰到食物后食物消失,蛇会增加一个单位的长度
- 当蛇触碰到自己或者障碍物,则游戏失败
- 当蛇接触到地图边界,蛇会在地图另一端重新进入地图
开发环境
- OpenGL3
- GLFW
- GLAD
Tips 一个简单的贪吃蛇游戏demo需要包括(代码以教程breakout为例)
- 主程序:程序窗口管理、按键响应、游戏对象管理、状态传递(维护程序状态)
- 精灵类:维护精灵状态,提供渲染接口
- 工具类:管理着色器、纹理的加载(也有人习惯把这部分代码耦合到精灵类中!)
- 游戏类:维护游戏状态,提供更新状态的接口供主程序调用,进行碰撞检测等
虽然一个完整游戏包含的内容远不止上面提到的四点,实现了这些内容,游戏的主体部分就大致完成了
要求
- 完成贪吃蛇游戏的框架搭建(60%)
- 完成蛇以及食物的 3D 精灵加载和渲染,其中模型可以用简单的纯色几何模型实现如立方体、球体;或者网上下载合适的3D模型如Apple-Poly、Snake-Poly(20%)
- 实现蛇的控制(20%)
参考资料
实现内容
1. 完成贪吃蛇游戏的框架搭建
程序窗口管理、按键响应、游戏对象管理、状态传递
void resize(int w, int h) {
if (h == 0)
h = 1;
float ratio = w * 1.0f / h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h);
gluPerspective(50, ratio, 1, 200);
glMatrixMode(GL_MODELVIEW);
}
void SpecialKeyEvents(int key, int x, int y) {
switch (key) {
case GLUT_KEY_LEFT:
snake->move(D_LEFT);
break;
case GLUT_KEY_RIGHT:
snake->move(D_RIGHT);
break;
case GLUT_KEY_UP:
snake->move(D_UP);
break;
case GLUT_KEY_DOWN:
snake->move(D_DOWN);
break;
}
}
void KeyEvents(unsigned char key, int x, int y) {
switch (key) {
case 27:
exit(0);
break;
case 'w':
camY *= 1.2;
break;
case 's':
camY *= 0.8;
break;
case 'a':
camX *= 1.2;
break;
case 'd':
camX *= 0.8;
break;
case 'q':
camZ *= 1.2;
break;
case 'e':
camZ *= 0.8;
break;
}
if (key <= '9')
cam[key-'0'] += 10;
}
void initGL(void) {
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse);
glLightfv(GL_LIGHT1, G