Как работает случайная генерация minecraft

Этот генератор придумал я, но возможно он уже был где-то, но я не видел, так что если уже где-то выложен гайд как создать его, прошу ссылку.

Ахтунг! Потребуется много ресурсов и места!
Примерный расчёт стоимости по ресурсам:1-3 стаков редстоуна (зависит от выбранных клок-генераторов.
1-2 стака несыпучих блоков (зависит от выбранных клок-генераторов.)
Пол стака повторитеелей (да да, от них зависит.)
Пол стака красных факелов (от них-же зависит.)

Делаем/роем/находим более-менее ровную площадку.

Делаем любой клок-генератор:

Делаем выходы, сколько нам нужно (чем больше тем сложнее 3-оптимально). Я выбрал 3 выхода:

Ставим повторитель, блок после повторителя, на 2ом блоке над блоком-проводником ставим липкий поршень, активируем его и блок поднимается. Возле поршня делаем любой клок-генератор (описываю как на один выход, повторять на каждый выход)
Прим:На каждый поршень нужно делать отдельный клок-генератор. Примеры ниже.

После этих манипуляций, каждый поршень опускается со своим тактом, и легче настраивать:

Делаем выходы, и строим свою систему!

Вот моё казино, с диспенсерами:

Примечания:
1) Иногда выходных сигналов может быть несколько, чтобы уменьшить количество таких казусов, нужно поколдовать с повторителями (свести на нет это досадное событие невозможно).
2) Если вам тяжело расставаться с драгоценной слизью, но вы играете с индастриалом, можете вместо слизи использовать необработанную резину. Вроде получается липкий поршень.
3) Если вы знаете другие виды рандом-генератора, скиньте ссылку, этот вариант не подходит для некоторых систем.

Статья взята из открытого источника. Если вы против размещения статьи, свяжитесь с администратором сайта.

Это вторая часть руководства по созданию собственной Minecraft-подобной игры. В ней мы напишем генератор мира и добавим персонажа, который сможет перемещаться по миру, ставить и удалять блоки. В предыдущей части мы создали куб с текстурой.

Прежде чем мы приступим к программированию, давайте добавим на нашу сцену направленный свет. Нам нужен источник света, чтобы лучше видеть наш 3D-мир.

Вы можете поменять направление света, если хотите:

Позиционируем источник света

Теперь мы можем перейти к написанию нашего первого скрипта. Мы хотим реализовать функционал добавления нового экземпляра куба около стороны, на которую мы щелкаем правой кнопкой мыши, и удаления существующего блока по нажатию левой клавиши. Во вкладке Project перейдите в папку Code и создайте два C#-скрипта.

Добавляем в проект C#-скрипт

Мы назовем их WorldGenerator и ClickOnFaceScript.

Прежде чем мы продолжим, вам крайне рекомендуется ознакомиться со скриптингом в Unity.

Теперь откройте WorldGenerator.cs в MonoDevelop (которая уже установлена вместе с Unity) двойным щелчком по нему и введите следующий код:

Мы используем статический метод, чтобы создать клон нашего куба. Unity позволяет нам задать имя и позицию клона. Больше информации о методе Instantiate вы можете получить здесь.

В Minecraft, если вы находитесь достаточно близко к кубу и кликаете по нему левой кнопкой мыши, он исчезает и появляется в вашем инвентаре. Когда вы кликаете правой клавишей на любую из сторон куба, новый экземпляр появится на той стороне, по которой вы кликнули, в случае, если у вас достаточно материала в инвентаре. В данном уроке мы не будем ставить перед собой ограничения, так что у нас будет бесконечное количество кубов и бесконечная дистанция клика.

Competentum, Москва, Брянск, Санкт-Петербург, Ижевск

Откройте ClickOnFaceScript.cs и введите туда этот код:

Теперь переместите скрипт на каждую из шести сторон куба на сцене.

Применяем скрипт к GameObject

Скрипт должен появиться на каждой стороне во вкладке Inspector.

Тестируем нажатия кнопок мыши

Запомните! В режиме игры любые изменения, которые вы произвели с элементами во вкладке Scene, будут отменены. Не меняйте ничего, пока игра запущена. Нажмите
еще раз, чтобы остановить игру.

Теперь у нас есть все что нужно, чтобы создавать новые кубы по клику правой клавишей мыши. Мы должны определить точную позицию нового GameObject, который будет появляться при клике. На нашей сцене расстояние между центрами двух соседних блоков равно единице.

Для простоты мы назовем центр куба, по которому кликают, буквой C, а центр блока, который должен появиться — N. Мы рассматриваем эти центры как позиции в 3D-пространстве.

  • Если мы кликаем на верхнюю грань: N = C + (0, 1, 0);
  • На нижнюю: N = C + (0, -1, 0);
  • На правую: N = C + (1, 0, 0);
  • На левую: N = C + (-1, 0, 0);
  • На переднюю: N = C + (0, 0, 1);
  • На заднюю: N = C + (0, 0, -1).

Мы можем обобщить сказанное выше в простую формулу: N = C + delta, где delta — это смещение, требуемое для расчета центра нового блока. Каждая из шести сторон содержит свой экземпляр ClickOnFaceScript и разное значение delta.

Мы должны изменить ClickOnFaceScript.cs, чтобы реализовать функционал, описанный выше. Откройте скрипт и измените файл таким образом:

Вернитесь в редактор и поменяйте значения delta в соответствии с картинками:

Вся необходимая информация обведена

Проверьте, что все работает. Запустите игру несколько раз, задавая разные позиции камере (изменяя ее Transform во вкладке Inspector), чтобы проверить, что введенные нами значения delta верны.

Настраиваем позицию камеры и нажимаем на стороны кубов

Если все работает, как задумано, мы можем перейти к созданию персонажа, чтобы мы могли свободно двигаться в нашей игре. К счастью для нас, Unity предоставляет готовый пакет с контроллером персонажа от первого лица, так что нам не нужно будет создавать его с нуля. Перейдите в Assets → Import Package и выберите Character Controller.

Импортируем пакет Character Controller

В окне Importing package выберите следующее:

Во вкладке Project перейдите в Standard Assets → Character Controllers, выберите First Person Controller.prefab и перетащите его во вкладку Hierarchy.

Заготовка First Person Character Controller

Расположите его близко к центру сцены.

Настраиваем местоположение заготовки

Мы должны защитить нашего персонажа от падения, прежде чем перейти к тестированию. Мы вернем значение обратно, когда закончим алгоритм генерации мира.

Гравитация не нужна!

Проверьте, что все работает.

У First Person Controller на нашей сцене есть Camera, прикрепленная, как дочерний GameObject. Когда мы запустим игру, эта камера станет главной на сцене, так что нам больше не нужна другая. Каждая камера содержит компонент AudioListener. Это и есть причина, по которой сообщение “There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.” появляется во вкладке Console. Отключите объект Main Camera во вкладке Hierarchy.

Отключаем главную камеру

Мы почти закончили! Откройте скрипт WorldGenerator.cs и модифицируйте его:

Скрипт будет запускаться только тогда, когда он прикреплен к какому-нибудь GameObject на сцене. Создайте пустой Empty GameObject и перетащите WorldGenerator.cs на него.

Перетаскиваем WorldGenerator.cs на новый GameObject

Перетащите объект Voxel на соответствующее поле в скрипте. Эта версия алгоритма генерации мира хранит все блоки в памяти, так что не рекомендуется задавать большие значения полям Size X, Size Y и Size Z, иначе вам грозит низкая производительность или, что еще хуже, Unity может вылететь.

Размеры больше указанных выставлять не стоит

Прежде чем мы увидим нашу разработку в действии, не забудьте поправить поле Gravity в скрипте, прикрепленном к Character Controller.

И всё-таки гравитация важна

Готово! Нажмите
и веселитесь!

Как Яндекс использует ваши данные и машинное обучение для персонализации сервисов — читать и смотреть YaC 2019.

Думаю, почти все читатели Хабра слышали про майнкрафт, кто-то играл в сингле, кто-то на одном из многочисленных серверов, был даже небольшой сервер у кого-то из хабраюзеров. После двух месяцев игры я задумался — а реально ли написать свой генератор карты? Как оказалось, это вполне возможно сделать за несколько дней неторопливого гугления и кодинга.

Реализовать такую структуру можно на любом языке, я остановился Delphi 7. Во-первых, это пока единственный язык, который я знаю, во-вторых, именно на 7 версии года 4 назад я начинал писать блокноты по мануалам из Игромании.

Так как данные хранятся в сжатом виде, нам необходим модуль zlib.
Я использовал ZlibEx

Для начала создадим класс чанка, в который будем впоследствии писать данные

Функция getoffset выдает нужое смещение по формуле y + ( z *128 + ( x * 128 * 16 ) )

Добавим в var пару переменных:

Процедура для сборки всех чанков в готовый файл:

Всё, теперь мы имеем метод записи любого блока по любой координате, в пределах региона. При желании, несложно повторить то же для остальных регионов, надо строк 10 кода.

Обертка для writeblock:

Генерация мира, его сжатие и сохранение.

Результат:

Можно генерировать не только пиксельарт, но произвольные фигуры, все, что можно задать какой-либо формулой. Например, пол в виде синусоиды:

Проект можно скачать тут.

Known bugs:

  • Невозможно сохранять изменения в сгенерированном регионе (возможно, из-за того, что пишется одинаковый timestamp, который не совпадает с временем последнего сохранения в level.dat, как разберусь с форматом последнего — попробую реализовать)
  • Спавн лучше переставить с помощью McEdit, т.к вполне возможно, что после генерации он окажется в сотне блоков над землей, что чревато летальным исходом(тоже можно менять в level.dat)
  • Нет генерации света, вместо этого освещены все блоки, даже под землей(Рассчет освещения — отдельная серьёзная задача, пока не готов ее решать)

ToDo:

  • Починить сохранение, т.к без этого теряется половина смысла
  • Сделать поддержку записи дополнительной инфы(цвет шерсти, листвы, ориентация печек, etc) // частично готово
  • Какое-то подобие ландшафта(холмы/дома/озера)

Редакторы Хабра врываются в велосезон, каждый по-своему

Похожие публикации

  • 29 апреля 2012 в 21:19

Комментарии 49

Еще, на сколько я помню, после каждого write в файл seek делать не нужно, потому как запись сама перемещает указатель по файлу.

И, вопрос, код действительно такой страшный, без отступов или это при раскраске съелось?

вручную мне его форматировать лень

под механикой вы наверно имеете ввиду примитивную физику мира, AI мобов и логику редстоуна? ну так вот я не верю что они в силах уложить на лопатки современный 4х ядерный проц(который кстати и не грузится особо при игре).

Вообще я ради интереса довольно долго следил за тем как себя ведет игра, но до конца так и не понял: например внутриигровая статистика(по F3) показывает что используется 200-300мб оперативы(из выделенного для жавы гига) при этом через пару часов игры винда выдает сообщение о нехватке оперативы и предлагает закрыть майнкрафт. если продолжить играть то через какое то время игра сама выдаст сообщение что память закончилась и надо перезапустить игру. на за все время игры потребление оперативы по внутренней инфе не превышало и 500мб, да и видно что сборщик мусора постоянно работает. еще мне не совсем понятно что майнкрафт постоянно делает с винтом — очень активно постоянно чтото читает/пишет… это при том что игра весит 40мб, а небольшой мир 10-20мб — которые можно держать в озу и синкать раз в минуту или реже.

пробовал как на jde6, так и на jde7. на линухе кстати тормозов заметно меньше, но там проблемы с управлением бывают и с захватом курсора. ну и еще стоит запустить параллельно с игрой какой нибуть хром или фаерфокс(с парой закладок) и в игре начинают появляться фризы.

В общем жду и надеюсь что появится аналог майнкрафта без джавы. пока поигрывая в террарию:)

Механика примитивная, но затратная. Для каждого кубика надо: пересчитать свет если он изменился от времени суток или другого кубика; если вода — проверить не растечётся ли она на соседние блоки; если земля — не вырастет ли на блоке трава или что-то другое; то же самое для снега, и прочее, и прочее.
И вот на таких вот несложных алгоритмах Java со своим JIT-компилятором не на очень много уступает в производительности Си.

Потребеление памяти изнутри показывается не всё, а только то, что приходится на кучу. Есть ещё так называемая PermGen память.

А Террария — это же .Net, та же Java, только вид сбоку.

я прекрасно понимаю что там дофига мелких(примитивных по большей части) расчетов, но это абсолютно ничего не меняет — возьмите любой современный шутер с практически реальной физикой, динамическим освещением, аи ботов — он идет на компе без тормозов, а майнкрафт начинает лагать. и врядли виной тому сам код игры, думаю главная проблема всеже в яве.

.Net может в чем то и аналог явы, но намного лучше вылизанный(но конечно не такой кроссплатформенный). хотя это взгляд пользователя софта на обоих платформах. может для программиста ява идеал, а дотнет сущий ад — об этом судить не могу.

В шутерах как раз больше вычисляется графика — полигоны, освещение, шейдеры, и это всё работает большей частью внутри видеокарты. А с физикой там расчитывается небольшое количество близлежащих объектов. Шутеры и летают на современных видеокартах, а не самих компах. Stalker, например, с некоторыми модами, которые добавляют игровую механику, а не графику, тормозит не хуже Майнкрафта.

Я понимаю, что у публики к Java намертво приклеилась слава тормоза, но на самом деле не всё так просто.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Adblock
detector