机器翻译正文由机器翻译自项目原始文档(英文),排版经程序统一处理,可能存在偏差,请以原项目仓库为准。
工艺
适用于 Windows、Mac OS X 和 Linux 的 Minecraft 克隆版。只需几千行 C 代码,使用现代 OpenGL(着色器)。包括基于 Python 的服务器的在线多人支持。
http://www.michaelfogleman.com/craft/
功能
- 使用 Perlin / Simplex 噪声生成简单但美观的地形。
- 超过 10 种方块,并且可以轻松添加更多。
- 支持植物(草、花、树等)和透明物体(玻璃)。
- 天空中的简单云朵(不移动)。
- 昼夜循环和有纹理的天空穹顶。
- 世界变化保存在 sqlite3 数据库中。
- 支持多人游戏!
下载
Mac 和 Windows 二进制文件可在网站上获取。
http://www.michaelfogleman.com/craft/
请见下方从源代码运行的方法。
安装依赖项
Mac OS X
如果尚未安装,请下载并安装 CMake。你也可以使用 Homebrew 来简化安装:
brew install cmake
Linux(Ubuntu)
sudo apt-get install cmake libglew-dev xorg-dev libcurl4-openssl-dev
sudo apt-get build-dep glfw
Windows
下载并安装 CMake 和 MinGW。将 C:\MinGW\bin 添加到你的 PATH 。
下载并安装 cURL,确保 CURL/lib 和 CURL/include 位于你的 Program Files 目录中。
使用以下命令替代下一节中描述的命令。
cmake -G "MinGW Makefiles"
mingw32-make
编译并运行
一旦你安装了依赖(见上文),在终端中运行以下命令。
git 克隆 https://github.com/fogleman/Craft.git cd Craft cmake .
make
./craft
多人游戏
经过多年,craft.michaelfogleman.com 已被关闭。有关自建服务器的信息,请参见 Server 页面。
客户端
你可以通过命令行参数连接到服务器...
./craft [HOST [PORT]]
或者,在游戏中使用“/online”命令。
/online [HOST [PORT]]
服务器
你可以自己运行服务器,也可以连接到我的服务器。服务器是用 Python 编写的,但需要一个已编译的 DLL,这样它才能像客户端一样执行地形生成。
gcc -std=c99 -O3 -fPIC -shared -o world -I src -I deps/noise deps/noise/noise.c src/world.c
python server.py [HOST [PORT]]
控制
- WASD 前进、左移、后退、右移。
- 空格键跳跃。
- 左键点击摧毁方块。
- 右键点击或 Cmd + 左键点击创造方块。
- Ctrl + 右键点击将方块切换为光源。
- 1-9 选择要创造的方块类型。
- E 循环切换方块类型。
- Tab 切换行走和飞行模式。
- ZXCVBN 沿 XYZ 轴精确移动。
- 左 Shift 拉近/缩放。
- F 以正交模式显示场景。
- O 在主视图观察玩家。
- P 在画中画视图观察玩家。
- T 输入文本到聊天。
- 斜杠 (/) 输入命令。
- 反引号 (`) 在任意方块(告示牌)上书写文字。
- 方向键模拟鼠标移动。
- 回车键模拟鼠标点击。
聊天命令
/前往 [NAME]
传送到另一个用户。如果未指定 NAME,则会选择一个随机用户。
/列表
显示已连接用户的列表。
/登录 名称
切换到另一个注册的用户名。将重新联系登录服务器。用户名区分大小写。
/注销
取消认证并成为访客用户。除非重新执行 /login 命令,否则自动登录将不会再次发生。
/离线 [文件]
切换到离线模式。FILE 指定要使用的保存文件,默认值为 "craft"。
/online 主机 [端口]
连接到指定服务器。
/pq P Q
传送到指定区块。
/生成
传送回出生点。
截图
实现细节
地形生成
地形使用 Simplex 噪声生成——一种基于位置的确定性噪声函数。因此,在给定位置,世界总是以相同的方式生成。
世界在 XZ 平面上被划分为 32x32 的区块(Y 方向向上)。这使得世界可以是“无限”的(在较大的 X 或 Z 值下浮点精度目前是一个问题),同时也便于管理数据。只有可见的区块需要从数据库中查询。
渲染
只渲染暴露的面。这是一个重要的优化,因为绝大多数方块要么完全被隐藏,要么只暴露一两个面。每个区块为每个相邻区块记录一个一格宽的重叠,以便知道沿其边缘哪些方块是暴露的。
只渲染可见的区块。采用一种简单的视锥体裁剪方法来测试区块是否在摄像机视野中。如果不在,则不渲染。这也显著提高了性能。
当区块中的方块发生变化时,区块缓冲区会完全重新生成,而不是尝试更新 VBO。
文本使用位图图集渲染。每个字符渲染到由两个三角形组成的二维矩形上。
使用“现代” OpenGL——不使用已弃用的固定功能管线函数。顶点缓冲对象用于位置、法线和纹理坐标。顶点和片段着色器用于渲染。矩阵操作函数位于 matrix.c 中,用于平移、旋转、透视、正交等矩阵。3D 模型由非常简单的原始图形组成——主要是立方体和矩形。这些模型在 cube.c 中通过代码生成。
玻璃块和植物的透明性(植物并不占据其三角形原始图形的完整矩形形状)通过在片段着色器中丢弃品红色像素实现。
数据库
用户对世界的更改存储在 sqlite 数据库中。只存储差异,所以默认世界先生成,然后在加载时应用用户的更改。
主要数据库表名为“block”,列为 p、q、x、y、z、w。 (p, q) 标识区块,(x, y, z) 标识方块位置,(w) 标识方块类型。0 表示空方块(空气)。
在游戏中,区块在哈希表中存储它们的方块。(x, y, z) 键映射到 (w) 值。
方块的 y 位置限制为 0 <= y < 256。上限主要是人为限制,防止用户建造不必要的高结构。用户不允许破坏 y=0 的方块,以避免掉到世界下方。
多人游戏
多人模式使用普通套接字实现。采用简单的ASCII行协议。每行由命令代码和零个或多个逗号分隔参数组成。客户端通过简单命令请求服务器块:C,p,q,key。“C”代表“块”,(p,q)标识块。该密钥用于缓存——服务器只发送自客户端上次请求该块以来已执行的块更新。块更新(实时或块请求的一部分)以以下格式发送给客户端:B,p,q,x,y,z,w。发送完请求块的所有块后,服务器会发送一个更新的缓存键,格式为:K,p,q,key。客户端会存储该密钥,并在下次请求该块时使用。玩家位置的格式为:P,pid,x,y,z,rx,ry。pid 是玩家 ID,rx 和 ry 值表示玩家在两个不同轴上的旋转。客户端会插值过去两次位置更新中的玩家位置,以实现更流滑的动画。客户端最多每 0.1 秒向服务器发送位置(如果不移动则更短)。
客户端缓存到 sqlite 数据库时,首次连接到服务器时可能会占用性能。因此,sqlite 写入在后台线程上执行。所有写入都发生在事务中以求性能。事务每 5 秒提交一次,而不是按逻辑完成的工作量。环形/循环缓冲区用作队列,记录将写入数据库的数据。
在多人模式中,玩家可以在主视图或画中画视图中观察对方。PnP的实现出乎意料地简单——只需更换视口,从对方视角重新渲染场景即可。
碰撞测试
命中测试(用户指向的方块)是通过从玩家位置向外扫描射线,沿着瞄准矢量实现的。这方法并不精确,因此步进率可以调小以更准确。
碰撞测试只是调整玩家的位置,使其与相邻的障碍物保持一定距离。(云朵和植物不被标记为障碍物,所以你可以直接穿过它们。)
天空穹顶
天空使用纹理的天空穹顶。纹理的X坐标代表一天中的时间。Y值从天空球的底部映射到天空球的顶部。玩家始终处于球体中心。方块的碎片着色器还会采样天空纹理,根据方块相对于背景天空的位置,确定适合混合的雾色。
环境遮蔽
环境遮蔽的实现方式如本页所述:
http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/
依赖关系
- GLEW 用于跨平台管理 OpenGL 扩展。
- GLFW 用于跨平台窗口管理。
- CURL 用于 HTTPS / SSL 的身份验证过程中的 POST。
- lodepng 用于加载 PNG 纹理。
- sqlite3 用于保存用户添加/删除的区块。
- tinycthread 用于跨平台线程处理。
- 本文标题:Craft - 一个使用现代 OpenGL(着色器)用 C 编写的简
- 本文链接:https://www.cn121.com/clientgame/fogleman-craft.html
- 原项目:fogleman/Craft 版权归原作者 fogleman 及贡献者所有
- 收录信息:本站于 2026-09-30 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
- 开源协议:收录时本项目采用 MIT(查看 LICENSE 原文),本站译文为其衍生内容;使用、修改、分发请以该仓库 LICENSE 原文为准。
- 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 fogleman/Craft。
- 翻译说明:本页正文为人工智能生成内容——由机器翻译对原项目 README 初译、经程序校验排版,可能存在错漏,请以原项目文档为准。
- 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
- 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。