用c++做一个3D我的世界


以下是一个使用 C++ 和 OpenGL 构建一个简单 3D 类似“我的世界”场景的基本示例,此示例只是一个非常基础的框架,真正的“我的世界”游戏有很多复杂的功能,这里只是实现了简单的方块渲染和相机控制。 环境准备 要运行此代码,你需要安装 OpenGL 和 GLUT 库。在 Ubuntu 上可以使用以下命令安装: ```sh sudo apt-get install freeglut3-dev ``` 代码实现 ```cpp #include <GL/glut.h> #include <iostream> // 相机位置 float cameraX = 0.0f; float cameraY = 0.0f; float cameraZ = 5.0f; // 相机视角 float cameraAngleX = 0.0f; float cameraAngleY = 0.0f; // 方块世界大小 const int worldSizeX = 10; const int worldSizeY = 10; const int worldSizeZ = 10; // 方块世界数组 bool world[worldSizeX][worldSizeY][worldSizeZ]; // 初始化方块世界 void initWorld() { for (int x = 0; x < worldSizeX; ++x) { for (int y = 0; y < worldSizeY; ++y) { for (int z = 0; z < worldSizeZ; ++z) { world[x][y][z] = (rand() % 2 == 0); // 随机生成方块 } } } } // 绘制一个方块 void drawCube(float x, float y, float z) { glPushMatrix(); glTranslatef(x, y, z); glutSolidCube(1.0f); glPopMatrix(); } // 绘制整个世界 void drawWorld() { for (int x = 0; x < worldSizeX; ++x) { for (int y = 0; y < worldSizeY; ++y) { for (int z = 0; z < worldSizeZ; ++z) { if (world[x][y][z]) { drawCube(x, y, z); } } } } } // 显示回调函数 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // 设置相机视角 gluLookAt(cameraX, cameraY, cameraZ, cameraX + sin(cameraAngleX) * cos(cameraAngleY), cameraY + sin(cameraAngleY), cameraZ + cos(cameraAngleX) * cos(cameraAngleY), 0.0f, 1.0f, 0.0f); // 绘制世界 drawWorld(); glutSwapBuffers(); } // 键盘回调函数 void keyboard(unsigned char key, int x, int y) { switch (key) { case 'w': cameraX += sin(cameraAngleX) * 0.1f; cameraZ += cos(cameraAngleX) * 0.1f; break; case 's': cameraX -= sin(cameraAngleX) * 0.1f; cameraZ -= cos(cameraAngleX) * 0.1f; break; case 'a': cameraX -= cos(cameraAngleX) * 0.1f; cameraZ += sin(cameraAngleX) * 0.1f; break; case 'd': cameraX += cos(cameraAngleX) * 0.1f; cameraZ -= sin(cameraAngleX) * 0.1f; break; case 27: // ESC 键退出 exit(0); } glutPostRedisplay(); } // 特殊键盘回调函数(用于方向键) void special(int key, int x, int y) { switch (key) { case GLUT_KEY_UP: cameraAngleY += 0.05f; break; case GLUT_KEY_DOWN: cameraAngleY -= 0.05f; break; case GLUT_KEY_LEFT: cameraAngleX -= 0.05f; break; case GLUT_KEY_RIGHT: cameraAngleX += 0.05f; break; } glutPostRedisplay(); } // 初始化 OpenGL void init() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); initWorld(); } // 调整窗口大小回调函数 void reshape(int width, int height) { if (height == 0) height = 1; float aspect = (float)width / (float)height; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, aspect, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); } // 主函数 int main(int argc, char argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("3D Minecraft-like World"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutSpecialFunc(special); glutMainLoop(); return 0; } ``` 代码解释 1. 初始化世界:`initWorld` 函数随机生成一个方块世界。 2. 绘制方块:`drawCube` 函数绘制一个单个的方块。 3. 绘制世界:`drawWorld` 函数遍历整个世界数组,绘制所有存在的方块。 4. 相机控制:通过键盘输入(`w`, `s`, `a`, `d` 和方向键)来控制相机的位置和视角。 5. 显示回调:`display` 函数负责清除缓冲区、设置相机视角并绘制世界。 编译和运行 使用以下命令编译代码: ```sh g++ -o minecraft minecraft.cpp -lGL -lGLU -lglut ``` 运行生成的可执行文件: ```sh ./minecraft ``` 这个示例只是一个简单的开始,要实现一个完整的“我的世界”游戏,还需要添加很多功能,如光照、纹理、碰撞检测、方块破坏和放置等。 [2025-09-07 11:35:32 | AI问答 | 1573点数解答]
- c语言使用将整型变量a,b,c作为函数input的参数,用输入input输入这三个参数。再将a,b,c作为函数sort的参数。用sort将a,b,c将从大到小的顺序返回。并在主函数里面输出。 输入格式: "%d%d%d" 输出格式: "%3d%3d%3d\n" 输入样例: 1 2 3↙ 输出样例:(246点数解答 | 2024-10-22 22:06:20)187
- c语言使用将整型变量a,b,c作为函数input的参数,用输入input输入这三个参数。再将a,b,c作为函数sort的参数。用sort将a,b,c将从大到小的顺序返回。并在主函数里面输出。 输入格式: "%d%d%d" 输出格式: "%3d%3d%3d\n"(305点数解答 | 2024-10-22 22:07:27)249
- c语音 使用将整型变量a,b,c作为函数input的参数,用输入input输入这三个参数。再将a,b,c作为函数sort的参数。用sort将a,b,c将从大到小的顺序返回。并在主函数里面输出。 输入格式: "%d%d%d" 输出格式: "%3d%3d%3d\n" 输入样例: 1 2 3↙ 输出样例:(259点数解答 | 2024-10-25 00:53:10)133
- https://www.n.cn/?src=360ai_mso_aibox_online&s_type=l&q=%3C!doctype%20html%3E%20%3Chtml%20lang%3D%22zh-cn%22%3E%20%3Chead%3E%20%3Cmeta%20charset%3D%22utf-8%22%3E%20%3Cmeta%(92点数解答 | 2025-07-18 18:23:11)70
- 利用指针编写一函数,输入3个整数,按由大到小的顺序将它们输出。 输入格式: %d 输出格式: %3d 输入样例: 25 68 17 输出样例: 68 25 17(564点数解答 | 2024-05-12 16:05:05)180
- error pulling image configuration: get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/dd/dde0cca083bc75a0af14262b1469b5141284b4399a62fef923ec0c0e3b21f5bc/data?verify=1718779567-yktk6tarop5zlci2foyzezv1d78%3d: dial tcp 162.125.18.133:443: i/o timeout 国内pull镜像超时(321点数解答 | 2024-06-19 13:59:41)244
- error pulling image configuration: get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/dd/dde0cca083bc75a0af14262b1469b5141284b4399a62fef923ec0c0e3b21f5bc/data?verify=1718779567-yktk6tarop5zlci2foyzezv1d78%3d: dial tcp 162.125.18.133:443: i/o timeout 国内pull镜像超时(174点数解答 | 2024-06-19 14:02:11)249
- ctr: failed to copy: httpreadseeker: failed open: failed to do request: get "https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/e8/e8750203e98541223fb970b2b04058aae5ca11833a93b9f3df26bd835f66d223/data?verify=1718889407-z2%2fzuoq3stcmc3ffjbzyphxcaew%3d": dial tcp 210.56.51.192:443: i/o timeout(319点数解答 | 2024-06-20 20:28:30)529
- 以步进电动机闭环控制系统驱动的 3d 打印机项目目标 定位精度:达到 0.1 毫米级精度,实际定位误差不超过±0.05 毫米。 速度稳定性:在 0-50 毫米/秒的速度范围内,喷头移动速度波动不超过±5%。 响应及时性:对指令的响应时间不超过 50 毫秒,能在 100 毫秒内完成相应调整动作。 系统设计 1. 硬件选型 简要说明所选步进电动机型号和相关传感器等硬件。 2. 软件设计 (1)主程序流程图:[绘制主程序流程图] (2)各子程序流程图:[分别绘制各子程序流程图](3)代码,如何具体写(744点数解答 | 2024-07-03 15:18:13)230
- docker: error pulling image configuration: get "https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/2f/2f9ff65226108f6f5e77ef09257c7712c4a95c7c153be3753141ae40b64676d0/data?verify=1722314523-xu%2fzutrlynqxbt%2fkirwmqzo6uyi%3d": dial tcp 162.125.32.2:443: i/o timeout.(204点数解答 | 2024-07-30 11:58:15)246
- ctr: failed to copy: httpreadseeker: failed open: failed to do request: get "http://aliregistry.oss-cn-hangzhou.aliyuncs.com/docker/registry/v2/blobs/sha256/8f/8fdb1fc20e240e9cae976518305db9f9486caa155fd5fc53e7b3a3285fe8a990/data?expires=1723538397&ossaccesskeyid=ltai4fsqyu7kg56rtbsqahfw&signature=clgbrb254toifsatmagajeldyl4%3d&x-oss-traffic-limit=144897102": read tcp 10.0.23.16:37798->124.160.145.45:80: read: connection reset by peer(164点数解答 | 2024-08-13 16:15:17)421
- c语言将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1 ,要求改为1,4,5,6,8。从键盘输入5个整数,将其逆序存放。 输入格式: "%d" 输出格式: "%3d" 输入样例: 8 6 5 4 1 输出样例: 1 4 5 6 8(201点数解答 | 2024-10-19 12:22:21)299