Klon Minecraft untuk Windows, Mac OS X dan Linux. Hanya beberapa ribu baris C yang menggunakan OpenGL (shader) modern. Dukungan multipemain online disertakan menggunakan server berbasis Python.
http://www.michaelfogleman.com/craft/
Biner Mac dan Windows tersedia di situs web.
http://www.michaelfogleman.com/craft/
Lihat di bawah untuk menjalankan dari sumber.
Unduh dan instal CMake jika Anda belum memilikinya. Anda dapat menggunakan Homebrew untuk menyederhanakan instalasi:
brew install cmake
sudo apt-get install cmake libglew-dev xorg-dev libcurl4-openssl-dev
sudo apt-get build-dep glfw
Unduh dan instal CMake dan MinGW. Tambahkan C:MinGWbin
ke PATH
Anda.
Unduh dan instal cURL sehingga CURL/lib dan CURL/include berada di direktori Program Files Anda.
Gunakan perintah berikut sebagai pengganti perintah yang dijelaskan di bagian berikutnya.
cmake -G "MinGW Makefiles"
mingw32-make
Setelah Anda memiliki dependensi (lihat di atas), jalankan perintah berikut di terminal Anda.
git clone https://github.com/fogleman/Craft.git
cd Craft
cmake .
make
./craft
Setelah bertahun-tahun, craft.michaelfogleman.com telah dihapus. Lihat bagian Server untuk informasi tentang hosting mandiri.
Anda dapat terhubung ke server dengan argumen baris perintah...
./craft [HOST [PORT]]
Atau, dengan perintah "/ online" di dalam game itu sendiri.
/online [HOST [PORT]]
Anda dapat menjalankan server Anda sendiri atau terhubung ke server saya. Server ditulis dengan Python tetapi memerlukan DLL yang dikompilasi sehingga dapat melakukan pembuatan medan seperti klien.
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]
Teleportasi ke pengguna lain. Jika NAMA tidak ditentukan, pengguna acak dipilih.
/list
Menampilkan daftar pengguna yang terhubung.
/login NAME
Beralih ke nama pengguna lain yang terdaftar. Server login akan dihubungi kembali. Nama pengguna peka huruf besar-kecil.
/logout
Batalkan autentikasi dan jadilah pengguna tamu. Login otomatis tidak akan terjadi lagi sampai perintah /login dikeluarkan kembali.
/offline [FILE]
Beralih ke mode offline. FILE menentukan file penyimpanan yang akan digunakan dan defaultnya adalah "kerajinan".
/online HOST [PORT]
Hubungkan ke server yang ditentukan.
/pq P Q
Teleportasi ke bagian yang ditentukan.
/spawn
Teleportasi kembali ke titik spawn.
Medan dihasilkan menggunakan kebisingan Simplex - fungsi kebisingan deterministik yang diunggulkan berdasarkan posisi. Jadi dunia akan selalu dihasilkan dengan cara yang sama di lokasi tertentu.
Dunia dibagi menjadi potongan blok berukuran 32x32 di bidang XZ (Y terserah). Hal ini memungkinkan dunia menjadi “tak terbatas” (presisi floating point saat ini menjadi masalah pada nilai X atau Z yang besar) dan juga mempermudah pengelolaan data. Hanya potongan yang terlihat yang perlu ditanyakan dari database.
Hanya wajah terbuka yang dirender. Ini merupakan pengoptimalan yang penting karena sebagian besar blok tersembunyi sepenuhnya atau hanya memperlihatkan satu atau dua sisi. Setiap bongkahan mencatat tumpang tindih selebar satu blok untuk setiap bongkahan tetangganya sehingga ia mengetahui blok mana di sepanjang perimeternya yang diekspos.
Hanya potongan yang terlihat yang dirender. Pendekatan pemusnahan frustum yang naif digunakan untuk menguji apakah ada bagian yang terlihat oleh kamera. Jika tidak, maka tidak diberikan. Hal ini menghasilkan peningkatan kinerja yang cukup baik juga.
Buffer potongan dibuat ulang sepenuhnya ketika sebuah blok diubah dalam potongan itu, alih-alih mencoba memperbarui VBO.
Teks dirender menggunakan atlas bitmap. Setiap karakter dirender menjadi dua segitiga yang membentuk persegi panjang 2D.
OpenGL “Modern” digunakan - tidak ada lagi fungsi pipeline dengan fungsi tetap yang digunakan. Objek buffer vertex digunakan untuk koordinat posisi, normal dan tekstur. Vertex dan fragment shader digunakan untuk rendering. Fungsi manipulasi matriks ada di matriks.c untuk matriks translasi, rotasi, perspektif, ortografik, dll. Model 3D terdiri dari primitif yang sangat sederhana - kebanyakan kubus dan persegi panjang. Model-model ini dihasilkan dalam kode di cube.c.
Transparansi pada balok kaca dan tanaman (tanaman tidak mengambil bentuk persegi panjang penuh dari segitiga primitifnya) diterapkan dengan membuang piksel berwarna magenta di shader fragmen.
Perubahan pengguna pada dunia disimpan dalam database sqlite. Hanya delta yang disimpan, sehingga dunia default dibuat dan kemudian perubahan pengguna diterapkan di atas saat memuat.
Tabel database utama diberi nama “blok” dan memiliki kolom p, q, x, y, z, w. (p, q) mengidentifikasi potongan, (x, y, z) mengidentifikasi posisi blok dan (w) mengidentifikasi jenis blok. 0 mewakili blok kosong (udara).
Dalam permainan, bongkahan menyimpan bloknya di peta hash. Kunci (x, y, z) dipetakan ke nilai (w).
Posisi y balok dibatasi hingga 0 <= y < 256. Batas atas pada dasarnya merupakan batasan buatan untuk mencegah pengguna membangun struktur tinggi yang tidak perlu. Pengguna tidak diperbolehkan menghancurkan blok pada y = 0 untuk menghindari jatuh ke bawah dunia.
Mode multipemain diimplementasikan menggunakan soket biasa. Protokol berbasis garis ASCII yang sederhana digunakan. Setiap baris terdiri dari kode perintah dan nol atau lebih argumen yang dipisahkan koma. Klien meminta potongan dari server dengan perintah sederhana: C,p,q,key. “C” berarti “Potongan” dan (p, q) mengidentifikasi potongan tersebut. Kuncinya digunakan untuk caching - server hanya akan mengirimkan pembaruan blok yang telah dilakukan sejak klien terakhir kali meminta potongan tersebut. Pembaruan blok (dalam waktu nyata atau sebagai bagian dari permintaan potongan) dikirim ke klien dalam format: B,p,q,x,y,z,w. Setelah mengirimkan semua blok untuk potongan yang diminta, server akan mengirimkan kunci cache yang diperbarui dalam format: K,p,q,key. Klien akan menyimpan kunci ini dan menggunakannya saat berikutnya ia perlu meminta potongan itu. Posisi pemain dikirim dalam format: P,pid,x,y,z,rx,ry. Pid adalah ID pemain dan nilai rx dan ry menunjukkan rotasi pemain dalam dua sumbu berbeda. Klien menginterpolasi posisi pemain dari dua pembaruan posisi terakhir untuk animasi yang lebih halus. Klien mengirimkan posisinya ke server paling banyak setiap 0,1 detik (dikurangi jika tidak bergerak).
Caching sisi klien ke database sqlite dapat memerlukan kinerja intensif saat menyambung ke server untuk pertama kalinya. Karena alasan ini, penulisan sqlite dilakukan pada thread latar belakang. Semua penulisan terjadi dalam transaksi untuk kinerja. Transaksi dilakukan setiap 5 detik dan bukan sejumlah pekerjaan logis yang diselesaikan. Buffer berbentuk cincin/melingkar digunakan sebagai antrian data apa yang akan ditulis ke database.
Dalam mode multipemain, pemain dapat mengamati satu sama lain dalam tampilan utama atau tampilan gambar-dalam-gambar. Implementasi PnP ternyata sangat sederhana - cukup ubah area pandang dan render adegan lagi dari sudut pandang pemain lain.
Pengujian pukulan (blok apa yang ditunjuk pengguna) dilaksanakan dengan memindai sinar dari posisi pemain ke arah luar, mengikuti vektor penglihatannya. Ini bukanlah metode yang tepat, sehingga laju langkah dapat dibuat lebih kecil agar lebih akurat.
Pengujian tabrakan hanya menyesuaikan posisi pemain agar tetap berada pada jarak tertentu dari balok terdekat yang menjadi penghalang. (Awan dan tumbuhan tidak ditandai sebagai penghalang, jadi Anda melewatinya.)
Kubah langit bertekstur digunakan untuk langit. Koordinat X pada tekstur mewakili waktu dalam sehari. Peta nilai Y dari bagian bawah bola langit hingga bagian atas bola langit. Pemain selalu berada di tengah bola. Fragmen shader untuk balok juga mengambil sampel tekstur langit untuk menentukan warna kabut yang sesuai untuk dipadukan berdasarkan posisi balok relatif terhadap langit di belakangnya.
Oklusi ambien diterapkan seperti yang dijelaskan di halaman ini:
http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/