Создание карты плитки
Я программирую игру на основе плитки, и у меня есть некоторые основные плитки (трава, грязь и т. д.), но я не могу понять, как сделать хорошую генерацию случайных карт, потому что, когда я делаю какой-то действительно случайный выбор, если плитка должна быть травой /грязью, я получаю следующее:
Я понимаю, почему это происходит, но я хочу создать некоторые случайные сплошные участки травы или грязи. Что-то, что имеет смысл, вот так:
4 ответа
Что вы можете сделать, это случайное создание карты Voronoi следующим образом:
- Выбор случайных центров (см. черные точки) и произвольно решить, являются ли они травой или грязью.
- Затем для всех фрагментов проверьте, находится ли он ближе к центральной точке
center points
грязи или травы. - Готово!
Если то, что вы делали ранее, - «переворачивать монету» для каждой плитки (шум), генерация диаграммы Voronoi обеспечит гораздо лучший результат.
Вы можете улучшить это, разделив center point
на center points
с помощью алгоритма, который:
- Выбирает небольшую группу центров
islands
и обозначает их как лидеровcenters points
. - Итеративно добавляет случайную смежную неопределенную центральную точку в каждом повороте.
- Готово!
Вы можете использовать шум perlin, который обычно используется для генерации высотных карт. шум Perlin в играх
Тогда вы могли бы использовать высоту в качестве советника, насколько высока вероятность попадания травы /грязи в одну область карты.
Пример (значения шума Perlin от 0 до 256): Если значение превышает 200, вероятность того, что трава будет установлена, составляет 80% (грязь 20%). Если значение составляет от 100 до 200, вероятность того, что трава установлена, составляет 50% (грязь также 50%). Если значение меньше 100, вероятность того, что трава будет установлена, составляет 20% (грязь 80%).
http: //gamedevelopment.tutsplus.com/tutorials/generate-random-cave-levels-using-cellular-automata--gamedev-9664
вот моя версия метода клеточных автоматов начните с заполнения сетки случайным затем запустите эти правила куллулярных автоматов на пару раз
- Если живая клетка имеет менее двух живых соседей, она умирает.
- Если живая клетка имеет двух или трех живущих соседей, она остается живой.
- Если живая клетка имеет более трех живых соседей, она умирает.
- Если мертвая ячейка имеет ровно три живых соседства, она становится живой.
и он выглядит как пещера
индекс может быть преобразован в положение x & y и обратно с помощью этого кода
public int TileIndex(int x, int y)
{
return y * Generator.Instance.Width + x;
}
public Vector2 TilePosition(int index)
{
float y = index / Generator.Instance.Width;
float x = index - Generator.Instance.Width * y;
return new Vector2(x, y);
}
Я просто возвращаю список bools, потому что я использую этот список для многих вещей: пещеры, деревья, цветы, трава, туман, вода вы можете комбинировать несколько списков по-разному здесь я сначала удаляю все более мелкие пещеры, затем объединяю два случайных списка
Выберите точку на карте. Поместите желаемый тип плитки с базовым значением, таким как 40. Следите за тем, где вы разместили свою новую желаемую плитки. Добавьте начальную точку в список.
Для каждой точки в этом списке вы посещаете всех соседей. Пока у вас достаточно энергии (начиная с 40), добавьте нужную плитку и добавьте ее в список, который нужно посетить. Дайте новой плите меньше мощности, определенной вами. Самый простой = случайное опускание. После того, как вы посетили фрагмент из списка, удалите его. Начните сначала, посетив любые невидимые, но созданные фрагменты.