客户端游戏 活跃维护

Craft

fogleman/Craft

一个使用现代 OpenGL(着色器)用 C 编写的简单 Minecraft 克隆版本。

11115
Stars 标星
1455
Forks 分支
348
Watchers 关注
129
Open Issues
C
主要语言
MIT
开源协议
14.3 MB
仓库大小
2 年前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:fogleman/Craft
git clone https://github.com/fogleman/Craft.git
git clone git@github.com:fogleman/Craft.git
README.md master

机器翻译正文由机器翻译自项目原始文档(英文),排版经程序统一处理,可能存在偏差,请以原项目仓库为准。

工艺

适用于 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 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。