Создание карты плитки

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

В игре

Я понимаю, почему это происходит, но я хочу создать некоторые случайные сплошные участки травы или грязи. Что-то, что имеет смысл, вот так:

Желаемый результат

23 голоса | спросил ViliX64 21 J0000006Europe/Moscow 2014, 13:51:51

4 ответа


19

Что вы можете сделать, это случайное создание карты Voronoi следующим образом:

  1. Выбор случайных центров (см. черные точки) и произвольно решить, являются ли они травой или грязью.
  2. Затем для всех фрагментов проверьте, находится ли он ближе к центральной точке center points грязи или травы.
  3. Готово!

Если то, что вы делали ранее, - «переворачивать монету» для каждой плитки (шум), генерация диаграммы Voronoi обеспечит гораздо лучший результат.

Вы можете улучшить это, разделив center point на center points с помощью алгоритма, который:

  1. Выбирает небольшую группу центров islands и обозначает их как лидеров centers points.
  2. Итеративно добавляет случайную смежную неопределенную центральную точку в каждом повороте.
  3. Готово!

введите описание изображения здесь>> </p></body></html>

ответил wolfdawn 21 J0000006Europe/Moscow 2014, 13:56:20
22

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

Тогда вы могли бы использовать высоту в качестве советника, насколько высока вероятность попадания травы /грязи в одну область карты.

Пример (значения шума Perlin от 0 до 256): Если значение превышает 200, вероятность того, что трава будет установлена, составляет 80% (грязь 20%). Если значение составляет от 100 до 200, вероятность того, что трава установлена, составляет 50% (грязь также 50%). Если значение меньше 100, вероятность того, что трава будет установлена, составляет 20% (грязь 80%).

ответил Klitz 21 J0000006Europe/Moscow 2014, 14:09:07
8

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

<p> <a href= 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, потому что я использую этот список для многих вещей: пещеры, деревья, цветы, трава, туман, вода вы можете комбинировать несколько списков по-разному здесь я сначала удаляю все более мелкие пещеры, затем объединяю два случайных списка

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

<pre><code>private int GetAdjacentCount (List <bool> list, Vector2 p)
{
    int count = 0;
    for (int y = -1; y <= 1; y ++)
    {
        for (int x = -1; x <= 1; x ++)
        {
            if (! ((x == 0) & & (y == 0)))
            {
                Vector2 point = new Vector2 (p.x + x, p.y + y);
                if (PathFinder.Instance.InsideMap (точка))
                {
                    int index = PathFinder.Instance.TileIndex (point);
                    if (list [index])
                    {
                        подсчитывать ++;
                    }
                }
                еще
                {
                    подсчитывать ++;
                }
            }
        }
    }
    счетчик возврата;
}
private List <bool> GetCellularList (int steps, float chance, int birth, int death)
{
    int count = _width * _height;
    Список & л; BOOL > list = Enumerable.Repeat (false, count) .ToList ();
    for (int y = 0; y <_height; y ++)
    {
        for (int x = 0; x <_width; x ++)
        {
            Vector2 p = new Vector2 (x, y);
            int index = PathFinder.Instance.TileIndex (p);
            list [index] = Utility.RandomPercent (шанс);
        }
    }
    for (int i = 0; i & steps; i ++)
    {
        var temp = Enumerable.Repeat (false, count) .ToList ();
        for (int y = 0; y <_height; y ++)
        {
            for (int x = 0; x <_width; x ++)
            {
                Vector2 p = new Vector2 (x, y);
                int index = PathFinder.Instance.TileIndex (p);
                if (index == -1) Debug.Log (index);
                int соседний = GetAdjacentCount (список, p);
                bool set = list [index];
                если (задано)
                {
                    если (смежный <смерть)
                        set = false;
                }
                еще
                {
                    если (смежное & рождение)
                        set = true;
                }
                temp [index] = set;
            }
        }
        list = temp;
    }
    if ((шаги> 0) & & Utility.RandomBool ())
        RemoveSmall (список);
    возвратный лист;
}
</code></pre></body></html>

ответил Rakka Rage 27 J0000006Europe/Moscow 2014, 01:28:38
6

Выберите точку на карте. Поместите желаемый тип плитки с базовым значением, таким как 40. Следите за тем, где вы разместили свою новую желаемую плитки. Добавьте начальную точку в список.

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

ответил Jaapjan 21 J0000006Europe/Moscow 2014, 13:59:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132