Клон Minecraft для Windows, Mac OS X и Linux. Всего несколько тысяч строк C с использованием современного OpenGL (шейдеров). Поддержка многопользовательской онлайн-игры включена с использованием сервера на базе 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
Телепортируйтесь обратно к точке появления.
Рельеф генерируется с использованием симплексного шума — детерминированной функции шума, заданной в зависимости от положения. Таким образом, мир всегда будет генерироваться одинаково в данной локации.
Мир разделен на блоки размером 32x32 в плоскости XZ (Y вверху). Это позволяет миру быть «бесконечным» (точность с плавающей запятой в настоящее время является проблемой при больших значениях X или Z), а также упрощает управление данными. Из базы данных необходимо запрашивать только видимые фрагменты.
Рендерятся только открытые лица. Это важная оптимизация, поскольку подавляющее большинство блоков либо полностью скрыты, либо видны только одна или две грани. Каждый фрагмент записывает перекрытие ширины одного блока для каждого соседнего фрагмента, поэтому он знает, какие блоки по его периметру открыты.
Отрисовываются только видимые фрагменты. Для проверки того, находится ли фрагмент в поле зрения камеры, используется наивный подход отсеивания усеченных элементов. Если это не так, он не отображается. Это также приводит к довольно приличному улучшению производительности.
Буферы фрагментов полностью восстанавливаются при изменении блока в этом фрагменте вместо попытки обновления VBO.
Текст отображается с использованием растрового атласа. Каждый символ отображается в двух треугольниках, образующих 2D-прямоугольник.
Используется «современный» OpenGL — устаревшие конвейерные функции с фиксированными функциями не используются. Объекты буфера вершин используются для координат положения, нормалей и текстур. Для рендеринга используются вершинные и фрагментные шейдеры. Функции манипуляции с матрицами находятся в matrix.c для матриц перемещения, вращения, перспективы, орфографии и т. д. 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, чтобы не провалиться под мир.
Многопользовательский режим реализован с использованием старых добрых сокетов. Используется простой построчный протокол 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 — это идентификатор игрока, а значения rx и ry указывают вращение игрока по двум разным осям. Клиент интерполирует позиции игроков из двух последних обновлений позиций для более плавной анимации. Клиент отправляет свою позицию на сервер не чаще, чем каждые 0,1 секунды (меньше, если он не движется).
Кэширование на стороне клиента в базе данных sqlite может потребовать высокой производительности при первом подключении к серверу. По этой причине запись sqlite выполняется в фоновом потоке. Все записи происходят в транзакции для повышения производительности. Транзакция фиксируется каждые 5 секунд, в отличие от некоторого логического объема выполненной работы. Кольцевой/циклический буфер используется в качестве очереди для записи данных в базу данных.
В многопользовательском режиме игроки могут наблюдать друг за другом на основном экране или в режиме «картинка в картинке». Реализация PnP оказалась на удивление простой — просто измените область просмотра и снова визуализируйте сцену с точки зрения другого игрока.
Тестирование попадания (на какой блок указывает пользователь) реализуется путем сканирования луча от позиции игрока наружу, следуя вектору его взгляда. Это не точный метод, поэтому для большей точности скорость шага можно уменьшить.
Тестирование столкновений просто корректирует положение игрока, чтобы он оставался на определенном расстоянии от любых соседних блоков, которые являются препятствиями. (Облака и растения не помечаются как препятствия, поэтому вы проходите сквозь них.)
Для неба используется текстурированный небесный купол. Координата X текстуры представляет время суток. Значения Y отображаются от нижней части небесной сферы до вершины небесной сферы. Игрок всегда находится в центре сферы. Фрагментные шейдеры для блоков также выбирают текстуру неба, чтобы определить подходящий цвет тумана для смешивания, основываясь на положении блока относительно заднего неба.
Окружающая окклюзия реализована, как описано на этой странице:
http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/