Как разделить процедурный генерируемый мир на куски
Я думал о создании 2D-игры сверху вниз с псевдо-бесконечным процедурно-генерируемым миром. Я прочитал несколько статей о процедурной генерации и, возможно, я неправильно их понял или неправильно понял, но мне еще не приходилось сталкиваться с одной, объясняющей, как разделить мир на куски (как, очевидно, делает Minecraft).
Очевидно, мне нужно создать только ту часть мира, которую игрок может видеть в данный момент. Например, если моя игра основана на тайлах, я могу разделить мир на n*n кусков. Если бы игрок находился на границе такого чанка, я бы также генерировал соседний чанк (и).
Я не могу понять, как именно я беру процедурный алгоритм генерации мира и использую его только по одному фрагменту за раз. Например, если у меня есть алгоритм, который генерирует большую структуру (например, замок, лес, реку), которая будет распределяться по многим чанкам, как я могу настроить его так, чтобы он генерировал только один чанк, а затем смежные чанки?
Я прошу прощения, если я полностью пропустил что-то очевидное. Заранее спасибо!
1 ответ
Изучите алгоритм смещения средней точки. Обратите внимание, что точки вдоль одной стороны основаны на начальных значениях углов. Вы можете рассчитать их, не зная остальную часть сетки.
Я использовал этот подход для создания ландшафта. Мне нужно, чтобы края каждого "участка" местности совпадали с соседними участками. Используя вариант алгоритма смещения средней точки, я сделал так, чтобы высота каждой точки вдоль края фрагмента была рассчитана только на основе значений в двух углах. Если мне нужно было добавить случайность, я посеял генератор случайных чисел с данными из двух углов. Таким образом, любые два смежных фрагмента могут быть сгенерированы независимо, и края будут обязательно совпадать.
Вы можете использовать подходы для карт высот для других вещей. Вместо высоты данные могут определять тип растительности, плотность населения и т. Д. Вместо карты высот, где совпадают холмы и долины, вы можете иметь карту растительности, где совпадают леса.
Это, безусловно, требует творческого программирования для любого сложного мира.