Windows, Mac OS X 및 Linux용 Minecraft 클론. 최신 OpenGL(셰이더)을 사용하는 단지 수천 줄의 C입니다. Python 기반 서버를 사용하여 온라인 멀티 플레이어 지원이 포함됩니다.
http://www.michaelfogleman.com/craft/
Mac 및 Windows 바이너리는 웹사이트에서 사용할 수 있습니다.
http://www.michaelfogleman.com/craft/
소스에서 실행하려면 아래를 참조하세요.
아직 CMake가 없다면 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를 다운로드하여 설치합니다. PATH 에 C:MinGWbin 추가합니다.
CURL/lib 및 CURL/include가 Program Files 디렉터리에 있도록 cURL을 다운로드하고 설치합니다.
다음 섹션에 설명된 명령 대신 다음 명령을 사용하십시오.
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 평면에서 32x32 블록 덩어리로 분할됩니다(Y는 위쪽). 이를 통해 세계를 "무한"하게 만들 수 있으며(부동 소수점 정밀도는 현재 큰 X 또는 Z 값에서 문제가 됨) 데이터 관리도 더 쉽게 만듭니다. 보이는 청크만 데이터베이스에서 쿼리하면 됩니다.
노출된 면만 렌더링됩니다. 대부분의 블록이 완전히 숨겨져 있거나 한두 개의 면만 노출되므로 이는 중요한 최적화입니다. 각 청크는 인접한 각 청크에 대해 한 블록 너비의 중첩을 기록하므로 주변을 따라 어떤 블록이 노출되는지 알 수 있습니다.
보이는 청크만 렌더링됩니다. 순진한 절두체 선별 접근법은 청크가 카메라 시야에 있는지 테스트하는 데 사용됩니다. 그렇지 않으면 렌더링되지 않습니다. 결과적으로 성능도 상당히 향상되었습니다.
청크 버퍼는 VBO 업데이트를 시도하는 대신 해당 청크에서 블록이 변경되면 완전히 재생성됩니다.
텍스트는 비트맵 아틀라스를 사용하여 렌더링됩니다. 각 문자는 2D 직사각형을 형성하는 두 개의 삼각형으로 렌더링됩니다.
"현대적인" OpenGL이 사용됩니다. 더 이상 사용되지 않는 고정 기능 파이프라인 기능이 사용되지 않습니다. 정점 버퍼 개체는 위치, 법선 및 텍스처 좌표에 사용됩니다. 렌더링에는 정점 및 조각 셰이더가 사용됩니다. 행렬 조작 함수는 변환, 회전, 원근감, 직교 등의 행렬을 위한 행렬 조작 함수입니다. 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 값은 두 개의 서로 다른 축에서 플레이어의 회전을 나타냅니다. 클라이언트는 보다 부드러운 애니메이션을 위해 지난 두 위치 업데이트로부터 플레이어 위치를 보간합니다. 클라이언트는 최대 0.1초마다(움직이지 않는 경우 더 적은 시간) 자신의 위치를 서버에 보냅니다.
sqlite 데이터베이스에 대한 클라이언트 측 캐싱은 서버에 처음 연결할 때 성능 집약적일 수 있습니다. 이러한 이유로 sqlite 쓰기는 백그라운드 스레드에서 수행됩니다. 모든 쓰기는 성능을 위해 트랜잭션에서 발생합니다. 논리적인 작업량이 완료되는 것과 달리 트랜잭션은 5초마다 커밋됩니다. 링/순환 버퍼는 데이터베이스에 기록될 데이터에 대한 큐로 사용됩니다.
멀티플레이어 모드에서 플레이어는 기본 화면이나 화면 속 화면 보기에서 서로를 관찰할 수 있습니다. PnP 구현은 놀라울 정도로 간단했습니다. 뷰포트를 변경하고 다른 플레이어의 관점에서 장면을 다시 렌더링하기만 하면 됩니다.
적중 테스트(사용자가 가리키는 블록)는 시야 벡터를 따라 플레이어 위치에서 바깥쪽으로 광선을 스캔하여 구현됩니다. 이는 정확한 방법이 아니므로 단계 속도를 더 작게 만들어 더 정확할 수 있습니다.
충돌 테스트는 장애물인 인접한 블록으로부터 일정 거리를 유지하도록 플레이어의 위치를 조정하는 것뿐입니다. (구름이나 식물은 장애물로 표시되지 않으므로 바로 통과할 수 있습니다.)
하늘에는 질감이 있는 스카이 돔이 사용됩니다. 텍스처의 X 좌표는 시간을 나타냅니다. Y 값은 하늘 구의 아래쪽에서 하늘 구의 위쪽까지 매핑됩니다. 플레이어는 항상 구의 중심에 있습니다. 블록의 프래그먼트 셰이더는 하늘 텍스처를 샘플링하여 뒤편의 하늘을 기준으로 블록의 위치를 기반으로 혼합할 적절한 안개 색상을 결정합니다.
주변 폐색은 이 페이지에 설명된 대로 구현됩니다.
http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/