Windows、Mac OS X、Linux 用の Minecraft クローン。最新の OpenGL (シェーダー) を使用したわずか数千行の C。 Python ベースのサーバーを使用したオンライン マルチプレイヤー サポートが含まれています。
http://www.michaelfogleman.com/craft/
Mac および Windows のバイナリは Web サイトから入手できます。
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
スポーンポイントにテレポートして戻ります。
地形は、位置に基づいてシードされる決定論的ノイズ関数であるシンプレックス ノイズを使用して生成されます。したがって、世界は常に特定の場所で同じ方法で生成されます。
ワールドは XZ 平面 (Y が上) で 32x32 のブロック チャンクに分割されます。これにより、世界が「無限」になることが可能になり (浮動小数点精度は現在、大きな X 値または Z 値で問題になります)、データの管理も容易になります。データベースからクエリを実行する必要があるのは、表示されているチャンクのみです。
露出した面のみがレンダリングされます。大部分のブロックが完全に隠されているか、1 つまたは 2 つの面だけが露出しているため、これは重要な最適化です。各チャンクは、隣接するチャンクごとに 1 ブロック幅のオーバーラップを記録するため、周囲に沿ってどのブロックが公開されているかがわかります。
表示されるチャンクのみがレンダリングされます。素朴な錐台カリング手法を使用して、チャンクがカメラの視野内にあるかどうかをテストします。そうでない場合、レンダリングされません。これにより、パフォーマンスもかなり向上します。
チャンク バッファーは、そのチャンク内でブロックが変更されると、VBO を更新しようとするのではなく、完全に再生成されます。
テキストはビットマップ アトラスを使用してレンダリングされます。各文字は 2D 長方形を形成する 2 つの三角形上にレンダリングされます。
「最新の」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 ラインベースのプロトコルが使用されます。各行はコマンド コードと 0 個以上のカンマ区切りの引数で構成されます。クライアントは、単純なコマンド 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 の値は 2 つの異なる軸でのプレーヤーの回転を示します。クライアントは、アニメーションをよりスムーズにするために、過去 2 回の位置更新からプレーヤーの位置を補間します。クライアントは、最大 0.1 秒ごとにその位置をサーバーに送信します (移動していない場合はそれより少なくなります)。
sqlite データベースへのクライアント側のキャッシュは、サーバーに初めて接続するときにパフォーマンスに負荷がかかる可能性があります。このため、sqlite の書き込みはバックグラウンド スレッドで実行されます。パフォーマンスのために、すべての書き込みはトランザクション内で行われます。論理的な量の作業が完了するのではなく、トランザクションは 5 秒ごとにコミットされます。リング/循環バッファは、データベースに書き込まれるデータのキューとして使用されます。
マルチプレイヤー モードでは、プレイヤーはメイン ビューまたはピクチャ イン ピクチャ ビューでお互いを観察できます。 PnP の実装は驚くほど簡単で、ビューポートを変更して、他のプレイヤーの視点からシーンを再度レンダリングするだけです。
ヒット テスト (ユーザーがどのブロックを指しているか) は、プレイヤーの位置から視線ベクトルに従って外側に向けて光線をスキャンすることによって実装されます。これは正確な方法ではないため、より正確にするにはステップ レートを小さくすることができます。
衝突テストでは、障害物である隣接するブロックから一定の距離を保つようにプレイヤーの位置を調整するだけです。 (雲や植物は障害物としてマークされていないため、そのまま通過できます。)
空には質感のあるスカイドームを使用。テクスチャの X 座標は時刻を表します。 Y 値は、天球の底部から天球の上部までマップされます。プレイヤーは常に球の中心にいます。ブロックのフラグメント シェーダーも空のテクスチャをサンプリングして、背景の空に対するブロックの位置に基づいてブレンドする適切な霧の色を決定します。
アンビエント オクルージョンは、このページで説明されているように実装されます。
http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/