Требования
- Вы хотите несколько путей от А до Б.
- Вы хотите работать в пространстве сетки, вероятно, это пространство листов для вашей боковой прокрутки.
- Вы не хотите, чтобы пути пересекались, иначе это может испортить ход игры.
- Вы хотите, чтобы пути выглядели достаточно органично.
Диаграммы Вороного
Диаграммы Вороного - это заполняющие пространство плоские графы:
Одна хорошая вещь о них - то, как вы можете использовать их, чтобы создать органические пути. Если вы нарисуете прямую линию от центра к центру, вы получите довольно непредсказуемый (читай: неортолинарный) путь.
Как создать диаграмму Вороного для использования с системой на основе плиток
Создайте карту разумного размера, скажем, 128x128. Генерация n
случайных координат сетки (x, y) на карте и заполнение каждого уникальным идентификатором / цветом. Создайте список для этого цвета и добавьте в него начальную ячейку; сделать это для каждого цвета.
Теперь у вас есть эти уникальные цветные точки, плавающие в пустоте, но вам нужно создать целые островки цвета вокруг них, чтобы конечный результат выглядел так:
Для этого нам нужно увидеть, какой цвет принадлежит каждой ячейке на карте (ячейка = пиксель на изображении выше). Мы пробегаем каждую ячейку на карте, проверяя, какая из наших n
начальных цветовых точек ближе всего к ней (через Пифагора). Эта ячейка попадает в список, связанный с этим уникальным идентификатором / цветом ... далее называемые островками AKA Voronoi (на приведенной выше диаграмме группы пикселей одного цвета).
Теперь у вас должна быть квантовая диаграмма Вороного. Следующим шагом является анализ смежности каждого острова с другими островами. Установите простой узел и структуру ребер, чтобы вы могли хранить график (узел - это просто идентификатор, список для этого идентификатора и пустой список ребер; ребро - это только начальный и конечный узел). Для каждого острова с уникальным идентификатором создайте узел и добавьте ребра, чтобы связать его с каждым островом, к которому он прилегает.
Получив полную диаграмму (график), вы переходите к забавной части: используйте график, чтобы найти цепочки островов, и, сделав все ячейки на каждом острове в цепочке с одинаковым идентификатором, вы получите одну из ваши пути. Допустим, остров со всеми ячейками с идентификатором 503 находится рядом с островом с идентификатором 657. Вы можете заменить все 503 ячейки идентификатором 657, создав, таким образом, один большой остров из смежных 657.
Например - красный - это путь 1, синий - это путь 2, пурпурный - оба:
Вы можете использовать любые существующие графовые алгоритмы (включая A *) для генерации путей от начала до конца. Получение извилистого пути - это случай, когда не всегда используется оптимальный шаг к острову цели.
Наконец, тривиально уменьшить острова, если вы хотите более узкие пути, или использовать большую карту с большим количеством островов, чтобы получить более точное разрешение.
Необязательный, последний шаг для поиска пути
Либо вы можете использовать график высокого уровня, который вы построили в сочетании с нижележащими ячейками / тайлами, для выполнения времени выполнения A *, либо вы можете совершать восхождение на холм на нижележащие ячейки / тайлы для лучшего движения:
В центральной (или любой) координате острова цели вы можете разместить ячейку влияния. Это влияние может накачивать «запах», как в Collaborative Diffusion . Этот аромат будет распространяться вниз по пути обратно к тому, что было начальным островом, становясь все слабее и слабее. Теперь для существа в начале мы просто поднимаемся от клетки с более низким ароматом к ячейке с более высоким ароматом, каждый раз приближая вас к цели - так же, как действует собака. Каждый путь является примерно линейным, что позволяет избежать использования A * во время выполнения. Или вы можете сделать то же самое с графиком островов, но этот способ немного сложнее, потому что вы, вероятно, захотите перемещаться по своим сущностям на уровне плиток. Так что первый способ, возможно, лучше. В любом случае вы сможете перейти к цели при низких затратах на обработку.