Как я могу случайным образом сгенерировать 2D-рельеф боковой прокрутки на основе тайлов?

11

Я хочу случайным образом сгенерировать карту для 2D-игры с боковым скроллером, используя следующий набор тайлов: введите описание изображения здесь

Я нашел несколько отличных статей о процессе битовой маскировки, например: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -метод-для-нанесения-tilemaps /

Мне нравится идея использовать битовую маску / плитку вместо огромного оператора if или оператора switch.

Однако у меня возникают проблемы с визуализацией всего процесса, и ни одна из этих статей не говорит о рандомизации.

Мои плитки соединяются друг с другом разными способами, а не только одним способом, как кажется в плитах в примерах, которые я привел.

Например вот несколько примеров:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Поскольку мои плитки соединяются друг с другом по-разному, я не думаю, что 8-битная маска будет работать. Поэтому я думал об использовании большей битовой маски. Что-то вроде char [8] или char 4 .

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

erebel55
источник

Ответы:

3

Да, размер маски будет расти с увеличением количества вариантов - ваша собственная ссылка http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ вторая часть объясняет основную идею.

По сути, вам придется перечислять X возможностей для каждой «границы» между плитками; в вашем конкретном примере это выглядит так, как будто «верх / низ плитки» может быть (1) белым (2) или (3) наполовину покрытым, что совпадает с «триным» примером, приведенным в статье.

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

Ваш конкретный набор тайлов на самом деле довольно ограничен - он описывает только одну поверхность, которая поднимается / опускается, и в любой начальной точке «целочисленного уровня» у вас есть только несколько действительных вариантов выбора. Например, после тайла № 2 возможны только тайлы № 1 или № 8. Вы можете просто перемещаться слева направо, составляя список, из которого (нескольких) плиток может идти после предыдущей, и выбирая один из них случайным образом.

Петерис
источник
Я думаю, что это ответ, который я ищу, однако это все еще немного облачно. Можете ли вы получить чуть более подробно, в текстовом или псевдокоде, как будет работать последняя часть вашего объяснения? «Вы можете просто перемещаться слева направо, составляя список, из которого (нескольких) плиток может идти после предыдущей, и выбирая один из них случайным образом».
erebel55
1
Для каждого типа плитки есть список того, какие плитки разрешены после этого - плиток так мало, что их можно быстро сделать вручную. «Высота» изменится, заполните все под новой плиткой # 10.
Петерис
Ах, так вы говорите, чтобы использовать этот метод вместо маскировки?
erebel55
1
Да, битовая маскировка полезна, если весь 2D-контент имеет смысл, но ваши карты кажутся одноуровневыми, горизонтальной поверхностью различной высоты.
Петерис
Это имеет смысл, «горы» будут разной высоты и будут перетекать друг в друга. Так что, по сути, это будет сплошная гора, изменяющая высоту по мере продвижения вперед. Вроде как косинус / синусоида, которая имеет случайные величины в разных точках. Должен ли я двигаться слева направо или сверху вниз при создании карты?
erebel55
6

Рассматривали ли вы возможность использования функции 1D Perlin или симплексного шума? В этом есть ряд преимуществ, в том числе:

  1. Бесконечный (в пределах точности с плавающей точкой), неповторяющийся рельеф

  2. Может генерироваться в режиме реального времени (даже в шейдере, который работает быстро ) или заранее, и храниться в текстурах, как в вашем примере

  3. Границы автоматически совпадают, так как Perlin и simplex являются непрерывными.

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

Посмотрите эту ссылку для довольно подробного объяснения реализации 1D Perlin.

Конверт - это в основном скалярное поле или функция, которая умножается на функцию шума перед сохранением или отображением вашего вывода.

введите описание изображения здесь

(Исходное изображение заимствовано из вышеуказанной статьи.)

В этом примере красная линия представляет кусочную функцию, определенную как

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... который может быть лучше определен с использованием гладкой функции. В этом случае он просто уменьшает масштаб до 0 перед плато, а затем обратно до 1 после.

Обновить

Вот пример трехмерного симплексного «ландшафта» из одного из моих проектов с применением рассеянного + зеркального освещения, созданного полностью внутри шейдерной трубы vert + tess + frag. Для вашей ситуации я бы взял вертикальный срез, чтобы получить уклон местности.

введите описание изображения здесь

И нисходящий орфографический вид:

введите описание изображения здесь

3Dave
источник
Это техника для создания самих изображений плитки?
erebel55
1
@ erebel55 Да. Вы можете использовать 2D-функцию, чтобы решить, куда (на основе вашего примера) поместить различных детей растений в изображение, а также создать наклонную местность. Я использовал это в 3D с отличными результатами.
3Dave
Это выглядит как интересный метод, я просто не уверен, что хочу пойти по этому пути, так как мои изображения уже созданы.
erebel55
@ erebel55 да, нет причин бросать существующий материал, если он работает на тебя.
3Dave
Ну, у меня пока не работает случайное поколение, но я надеюсь;) Я дал вам возможность проголосовать за этот метод, так как он был интересным, и я могу использовать его в будущем. Спасибо
erebel55