Craft
用于Windows的Craft克隆,Mac OS X和Linux。使用现代OpenGL(着色器)仅几千条C。使用基于Python的服务器包括在线多人游戏支持。
http://www.*michael**feman.com/craft/
特征
- 简单但漂亮的地形生成,使用珀林 /单纯噪声。
- 可以轻松添加10种以上类型的块和更多块。
- 支持植物(草,花,树木等)和透明度(玻璃)。
- 天空中的简单云(它们不动)。
- 白天 /夜间周期和一个质感的天穹顶。
- 世界变化持续存在于SQLITE3数据库中。
- 多人游戏支持!
下载
Mac和Windows二进制文件可在网站上找到。
http://www.*michael**feman.com/craft/
请参阅下文以从源运行。
安装依赖项
Mac OS X
如果您还没有下载并安装Cmake。您可以使用自制酿造来简化安装:
brew install cmake
Linux(Ubuntu)
sudo apt-get install cmake libglew-dev xorg-dev libcurl4-openssl-dev
sudo apt-get build-dep glfw
视窗
下载并安装CMAKE和MINGW。将C:\\MinGW\\bin添加到您的PATH 。
下载并安装卷发,以便在您的程序文件目录中使用Curl/Lib和Curl/Inclage。
使用以下命令代替下一节中描述的命令。
cmake -G \"MinGW Makefiles\"
mingw32-make
编译和运行
一旦获得依赖项(请参见上文),请在终端中运行以下命令。
Craft
cmake .
make
./ Craft \”>
git clone https://github**.*com/fogleman/Craft.git
cd Craft
cmake .
make
./ Craft
多人游戏
多年后, Craft .Michaelfememan.com被删除了。有关自我托管的信息,请参见服务器部分。
客户
您可以使用命令行参数连接到服务器…
./ Craft [HOST [PORT]]
或者,使用游戏本身的“/在线”命令。
/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]]
控件
- 沃斯(Wast)向前,向左,向后,右前进。
- 跳跃的空间。
- 左键单击以销毁一个块。
- 右键单击或CMD +左键单击以创建一个块。
- CTRL +右键单击以切换一个块作为光源。
- 1-9选择要创建的块类型。
- e循环通过块类型。
- 标签以在步行和飞行之间切换。
- ZXCVBN沿XYZ轴朝精确的方向移动。
- 左移缩放。
- F以拼字法显示场景。
- o观察主要视图中的球员。
- p在图片中观察玩家。
- t将文本输入聊天。
- 向前斜杠(/)输入命令。
- BackQuote(`)在任何块上写文本(符号)。
- 箭头键模仿鼠标运动。
- 输入模拟鼠标单击。
聊天命令
/goto [NAME]
传送到另一个用户。如果名称未指定,则选择随机用户。
/list
显示连接用户的列表。
/login NAME
切换到另一个注册的用户名。登录服务器将重新连接。用户名对病例敏感。
/logout
未经许可并成为客座用户。在重新发布 /登录命令之前,自动登录将不会再次发生。
/offline [FILE]
切换到离线模式。文件指定要使用的保存文件和默认为“ Craft ”。
/online HOST [PORT]
连接到指定的服务器。
/pq P Q
传送到指定的块。
/spawn
传送回生成点。
截屏
实施详细信息
地形一代
使用单纯形噪声生成地形 – 根据位置播种的确定性噪声函数。因此,在给定位置,世界将始终以相同的方式生成。
世界被分成XZ平面的32×32块块(Y已升起)。这使世界成为“无限”(浮点精度当前是大X或Z值的问题),并且还可以更轻松地管理数据。仅需要从数据库查询可见块。
渲染
仅呈现裸露的面孔。这是一个重要的优化,因为绝大多数块要么完全隐藏,要么只暴露一两个面。每个块记录了每个相邻块的单块宽度重叠,因此它知道沿其周长的哪个块被暴露出来。
仅渲染可见的块。一种天真的冰扣方法用于测试摄像机视野中是否有块。如果不是,则不会渲染。这也会带来相当不错的表现。
当块在该块中更改一个块时,块缓冲区将完全再生,而不是试图更新VBO。
文本是使用位图图集渲染的。每个字符都呈现到形成2D矩形的两个三角形上。
使用“现代” OpenGL – 不使用dobece悔的固定功能管道功能。顶点缓冲物对象用于位置,正常和纹理坐标。顶点和碎片着色器用于渲染。矩阵操作函数在矩阵中,用于翻译,旋转,透视,拼字等矩阵。 3D型号由非常简单的原语组成,主要是立方体和矩形。这些模型是在Cube.C中生成的。
通过在碎片着色器中丢弃洋红色的像素来实现玻璃块和植物(植物不占用其三角形原始矩形形状的完整矩形形状)的透明度。
数据库
对世界的用户更改存储在SQLite数据库中。仅存储三角洲,因此生成了默认世界,然后加载时用户更改将在顶部应用。
主数据库表被命名为“块”,并具有列P,Q,X,Y,Z,W。 (p,q)标识块,(x,y,z)标识块位置,(w)标识块类型。 0代表一个空块(空气)。
在游戏中,块将其块存储在哈希地图中。一个(x,y,z)键映射到(w)值。
块的y位限制为0 <= y <256。上限主要是人工限制,以防止用户建造不必要的高层结构。不允许用户在y = 0处摧毁块,以免落在世界下。
多人游戏
多人游戏模式是使用普通的插座实现的。使用了一个简单的,基于线路的协议。每行均由命令代码和零或更多逗号分隔的参数组成。客户端通过简单命令从服务器请求块:C,P,Q,键。 “ C”的意思是“块”,(P,Q)标识了块。该密钥用于缓存 – 服务器将仅发送自客户端上一次要求该块以来执行的块更新。块更新(实时或作为块请求的一部分)以格式发送给客户端:b,p,q,x,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的实现非常简单 – 只需从另一个玩家的角度更改视口,然后再次渲染场景即可。
碰撞测试
通过在视力向量之后从玩家的位置扫描射线,通过扫描射线来实现HIT测试(用户指向用户指向的障碍)。这不是一种精确的方法,因此可以使步骤速率更小以更准确。
碰撞测试只需调整玩家的位置即可保持一定距离与障碍物的任何相邻区块的一定距离。 (云和植物没有标记为障碍,因此您可以通过它们。)
天穹顶
天空使用质感的天圆顶。纹理的X坐标代表一天中的时间。 Y值从天空球的底部映射到天空球的顶部。玩家始终处于球体的中心。块的片段着色器还采样了天空纹理,以根据块相对于衬里的天空来确定适当的雾色与块的位置混合。
环境阻塞
如本页面所述实施环境阻塞:
http://0fps.wo*rd*pr*ess.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/
依赖性
- GLEW用于管理跨平台的OpenGL扩展。
- GLFW用于跨平台窗口管理。
- 卷曲用于身份验证过程的HTTPS / SSL POST。
- LODEPNG用于加载PNG纹理。
- SQLite3用于保存用户添加 /删除的块。
- TinycThread用于跨平台线程。
