Я хочу случайным образом сгенерировать карту для 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 .
Если кто-то может показать некоторые псевдокод / примеры того, как будет выглядеть общий алгоритм, я был бы очень признателен.
Рассматривали ли вы возможность использования функции 1D Perlin или симплексного шума? В этом есть ряд преимуществ, в том числе:
Бесконечный (в пределах точности с плавающей точкой), неповторяющийся рельеф
Может генерироваться в режиме реального времени (даже в шейдере, который работает быстро ) или заранее, и храниться в текстурах, как в вашем примере
Границы автоматически совпадают, так как Perlin и simplex являются непрерывными.
Хотя сам ландшафт является псевдослучайным, достаточно просто применить функцию огибающей или просто уменьшить количество октав в областях, где вам нужны ровные участки или другие нужные вам особенности местности.
Посмотрите эту ссылку для довольно подробного объяснения реализации 1D Perlin.
Конверт - это в основном скалярное поле или функция, которая умножается на функцию шума перед сохранением или отображением вашего вывода.
(Исходное изображение заимствовано из вышеуказанной статьи.)
В этом примере красная линия представляет кусочную функцию, определенную как
... который может быть лучше определен с использованием гладкой функции. В этом случае он просто уменьшает масштаб до 0 перед плато, а затем обратно до 1 после.
Обновить
Вот пример трехмерного симплексного «ландшафта» из одного из моих проектов с применением рассеянного + зеркального освещения, созданного полностью внутри шейдерной трубы vert + tess + frag. Для вашей ситуации я бы взял вертикальный срез, чтобы получить уклон местности.
И нисходящий орфографический вид:
источник