適用於 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/