Как работает карта без мозаики?

Хорошо, вот в чем дело. Недавно я решил, что хочу понять, как работает Генерация случайных карт. Я нашел некоторые документы и некоторые аргументы. Наиболее интересными были "Алмазный квадратный алгоритм" и "Смещение средней точки". Я все еще должен попытаться применить их к программному обеспечению, но кроме этого я наткнулся на этот сайт: http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/

Как видите, идея в том, чтобы использовать полигоны. Но я понятия не имею, как применить эту карту на основе плиток, даже как создавать эти многоугольники, используя инструменты, которые у меня есть (C++ и sdl). Я предполагаю, что нет никакого способа сделать это (пожалуйста, исправьте меня, если я ошибаюсь.) Но если это не так, как работает карта без мозаики и как генерируются эти полигоны?

2 ответа

Решение

Этот ответ не даст вам ответов, которые вы ищете, но, надеюсь, подберет вас достаточно близко!

Эта проблема

Я думаю, что блокирует вас, как представлять данные. Вы, вероятно, привыкли к двумерной сетке, которая просто представляет тип каждой плитки. Как вы знаете, это хорошо для обработки карты на основе тайлов, но не позволяет правильно моделировать миры, в которых тайлы имеют другую форму.

диаграммы

Я предлагаю вам увидеть проблему немного иначе. Сетка - это не более чем граф ( более подробная информация) с узлами, которые имеют 4 (или 8, если вы разрешаете диагонали) неявных соседних узла. Итак, во-первых, я бы на вашем месте перешел от вашей строгой стандартной 2D-сетки к более "свободному" графику, где каждый узел имеет position, position, список neighbors (в большинстве случаев у вас будут углы с 2 соседями, границы с 3 и "средние" плитки с 4) и, наконец, rendering component который просто рисует вашу плитку на экране по заданному position, Как только это будет сделано, вы сможете получить те же результаты на экране, что и в настоящий момент, с помощью своего механизма "2D Tile-Based", просто вызвав rendering component с каждым node чей ограничивающий прямоугольник (не касался его в том, что вы должны добавить к своему узлу, но я вернусь к этому позже) пересекается с усечением камеры (в двумерном мире, скорее всего, если позиция +/- размер пересекает RECT на данный момент прорисовывается).

Поиск

Более общий подход также поможет вам делать такие вещи, как поиск пути с помощью общих алгоритмов, которые исследуют nodes пока они не найдут правильный путь (см. A* или Dijkstra). Даже если вы решили придерживаться старой доброй игры 2D Tile Map, эти методы все равно будут полезны!

Да но я хочу полигоны

Я слышу тебя! Итак, если вы хотите полигоны, в основном все, что вам нужно сделать, это добавить к nodes список вершин и соответствующие данные, которые могут вам понадобиться для визуализации полигонов (цвета вершин, текстуры и карты U/V и т. д.) и обновления вашего rendering component сделать соответствующее OpenGL ( это, например, должно помочь) вызовы, чтобы нарисовать ваши узлы. Еще раз, первый шаг к итеративному обновлению 2D движка плиток до движка многоугольной карты состоит в том, чтобы для каждой плитки на вашей карте дать каждому nodes два треугольника, ресурс текстуры (плитка) и U/V-отображения (0,0 - 0,1 - 1,0 и 1,1). Еще раз, когда этот шаг сделан, у вас должен быть "универсальный" движок на основе многоугольника. Создание большей части этих данных может быть создано процедурно путем вычисления координат на основе положения плитки, размера плитки и т. Д.

Выпуклые полигоны

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

Сложные карты

Основываясь на предоставленной вами ссылке, вы хотите иметь довольно сложные карты. В этом случае автор использовал диаграммы Вороного для генерации полигонов карты. Уже есть решения для такой триангуляции, но вы также можете использовать другие методы, с которыми легче работать, если вы просто переключаетесь на 3D, например, этот. Если у вас есть интересные результаты, вы должны рассмотреть возможность реализации serialization сохранить / открыть данные карты из игры. Если вы хотите создать редактор, помните, что это может быть много работы, но может стоить того, если вы хотите, чтобы люди помогали вам создавать карты или добавлять элементы на карты (например, геометрия, которая не является частью ландшафта).

Я пошел повсюду с этим ответом, но, надеюсь, это поможет!

Просто переберите все плитки и проведите проверку попадания от центра плитки к поликам. Превратите тип плитки в тип многоугольника. Вам нужно больше, чем это?

РЕДАКТИРОВАТЬ: Извините, я понимаю, что, вероятно, не полезно. Играть с процедурными алгоритмами может быть весело и выгодно. Начните с цикла, который перебирает все тайлы и случайным образом выбирает, занят ли тайл. Затем повторите их снова и выберите, занят ли он или является его соседом.

Кроме того, проверьте исходный код для этого: http://dustinfreeman.org/toys/wall7-dustin.html

Другие вопросы по тегам