代码
#include <iostream>
#include <cmath>
#include <GL/glut.h>
#define PI 3.14159265358979323846
// 窗口大小
int windowWidth = 800;
int windowHeight = 600;
// 玩家位置和角度
float playerX = 0.0f;
float playerY = 0.0f;
float playerAngle = 0.0f;
// 玩家移动速度和旋转速度
float playerMoveSpeed = 0.05f;
float playerRotateSpeed = 0.05f;
// 函数声明
void display();
void reshape(int width, int height);
void keyboard(unsigned char key, int x, int y);
void update();
void drawPlayer();
void drawBullet(float x, float y, float angle);
void drawEnemy(float x, float y);
int main(int argc, char** argv) {
// 初始化GLUT和窗口
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(windowWidth, windowHeight);
glutCreateWindow("3D射击游戏");
// 设置回调函数
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutIdleFunc(update);
// 进入GLUT循环
glutMainLoop();
return 0;
}
void display() {
// 清空颜色缓存
glClear(GL_COLOR_BUFFER_BIT);
// 绘制玩家
drawPlayer();
// 绘制敌人
drawEnemy(2.0f, 2.0f);
// 交换前后缓冲区
glutSwapBuffers();
}
void reshape(int width, int height) {
// 设置视口大小和投影矩阵
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float)width / (float)height, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
}
void keyboard(unsigned char key, int x, int y) {
// 根据按键更新玩家位置和角度
switch (key) {
case 'w':
playerX += cos(playerAngle) * playerMoveSpeed;
playerY += sin(playerAngle) * playerMoveSpeed;
break;
case 's':
playerX -= cos(playerAngle) * playerMoveSpeed;
playerY -= sin(playerAngle) * playerMoveSpeed;
break;
case 'a':
playerAngle += playerRotateSpeed;
break;
case 'd':
playerAngle -= playerRotateSpeed;
break;
case 32: // 空格键发射子弹
drawBullet(playerX, playerY, playerAngle);
break;
}
glutPostRedisplay();
}
void update() {
// 游戏逻辑更新(例如敌人的移动、碰撞检测等)
glutPostRedisplay();
}
void drawPlayer() {
// 绘制玩家模型
glLoadIdentity();
glTranslatef(playerX, playerY, -5.0f);
glRotatef(playerAngle * 180.0f / PI, 0.0f, 0.0f, 1.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.1f, 0.0f);
glVertex3f(-0.1f, -0.1f, 0.0f);
glVertex3f(0.1f, -0.1f, 0.0f);
glEnd();
}
void drawBullet(float x, float y, float angle) {
// 绘制子弹
glLoadIdentity();
glTranslatef(x, y, -5.0f);
glRotatef(angle * 180.0f / PI, 0.0f, 0.0f, 1.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.05f, 0.0f);
glVertex3f(-0.025f, -0.05f, 0.0f);
glVertex3f(0.025f, -0.05f, 0.0f);
glEnd();
}
void drawEnemy(float x, float y) {
// 绘制敌人
glLoadIdentity();
glTranslatef(x, y, -5.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.1f, 0.0f);
glVertex3f(-0.1f, -0.1f, 0.0f);
glVertex3f(0.1f, -0.1f, 0.0f);
glEnd();
}
void update() {
// 游戏逻辑更新(例如敌人的移动、碰撞检测等)
// 敌人移动示例,每次更新坐标
static float enemyX = 2.0f;
static float enemyY = 2.0f;
enemyX += 0.01f;
enemyY += 0.01f;
glutPostRedisplay();
}
void drawPlayer() {
// 绘制玩家模型
glLoadIdentity();
glTranslatef(playerX, playerY, -5.0f);
glRotatef(playerAngle * 180.0f / PI, 0.0f, 0.0f, 1.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.1f, 0.0f);
glVertex3f(-0.1f, -0.1f, 0.0f);
glVertex3f(0.1f, -0.1f, 0.0f);
glEnd();
}
void drawBullet(float x, float y, float angle) {
// 绘制子弹
glLoadIdentity();
glTranslatef(x, y, -5.0f);
glRotatef(angle * 180.0f / PI, 0.0f, 0.0f, 1.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.05f, 0.0f);
glVertex3f(-0.025f, -0.05f, 0.0f);
glVertex3f(0.025f, -0.05f, 0.0f);
glEnd();
}
int main(int argc, char** argv) {
// 初始化GLUT和窗口
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(windowWidth, windowHeight);
glutCreateWindow("3D射击游戏");
// 设置回调函数
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutIdleFunc(update);
// 进入GLUT循环
glutMainLoop();
return 0;
}