适用于 Windows、Mac OS X 和 Linux 的 Minecraft 克隆版。使用现代 OpenGL(着色器)只需几千行 C 代码。使用基于 Python 的服务器包含在线多人游戏支持。
http://www.michaelfogleman.com/craft/
Mac 和 Windows 二进制文件可在网站上获取。
http://www.michaelfogleman.com/craft/
请参阅下文从源代码运行。
如果您还没有 CMake,请下载并安装它。您可以使用 Homebrew 来简化安装:
brew install cmake
sudo apt-get install cmake libglew-dev xorg-dev libcurl4-openssl-dev
sudo apt-get build-dep glfw
下载并安装 CMake 和 MinGW。将C:MinGWbin
添加到您的PATH
。
下载并安装 cURL,以便 CURL/lib 和 CURL/include 位于您的 Program Files 目录中。
使用以下命令代替下一节中描述的命令。
cmake -G "MinGW Makefiles"
mingw32-make
获得依赖项后(参见上文),请在终端中运行以下命令。
git clone https://github.com/fogleman/Craft.git
cd Craft
cmake .
make
./craft
多年后,craft.michaelfogleman.com 已被删除。有关自托管的信息,请参阅服务器部分。
您可以使用命令行参数连接到服务器...
./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]]
/goto [NAME]
传送到另一个用户。如果未指定 NAME,则会选择随机用户。
/list
显示已连接用户的列表。
/login NAME
切换到另一个注册用户名。将重新联系登录服务器。用户名区分大小写。
/logout
取消身份验证并成为访客用户。在重新发出 /login 命令之前,不会再次进行自动登录。
/offline [FILE]
切换到离线模式。 FILE 指定要使用的保存文件,默认为“craft”。
/online HOST [PORT]
连接到指定的服务器。
/pq P Q
传送到指定的区块。
/spawn
传送回重生点。
地形是使用 Simplex 噪声生成的 - 一种基于位置的确定性噪声函数。因此,在给定位置,世界总是以相同的方式生成。
世界在 XZ 平面(Y 向上)中被分割成 32x32 的块。这使得世界变得“无限”(浮点精度目前在大 X 或 Z 值时是一个问题),并且也使得数据管理变得更加容易。仅需要从数据库查询可见块。
仅渲染暴露的面。这是一项重要的优化,因为绝大多数块要么完全隐藏,要么只暴露一个或两个面。每个块记录每个相邻块的一块宽度重叠,因此它知道沿其周边的哪些块被暴露。
仅渲染可见块。使用朴素的视锥体剔除方法来测试块是否在相机的视野中。如果不是,则不会渲染。这也带来了相当不错的性能提升。
当块中的块发生更改时,块缓冲区会完全重新生成,而不是尝试更新 VBO。
文本使用位图集呈现。每个字符都被渲染到两个三角形上,形成一个 2D 矩形。
使用“现代”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/