Разработка пошаговой 4х стратегии. Реализация гексогональной карты.

    В данной статье рассмотрим устройство карты из шестиугольников и создание ландшафта. Такой подход применяют во многих играх в самых разных задачах. Так с помощью сетки из шестиугольников можно реализовывать механику неисследованных территорий на игровом поле в стратегических играх. Зачастую такое устройство карты используют в пошаговых играх. Если обратимся к сети Интернет с целью найти подобные проекты, то сразу обнаружим такие произведения игрового искусства, как Civilization, Age of Wonders, Humankind и подобные. Будем ориентироваться на данные игры при разработке своего проекта.

    У шестиугольника всего 6 соседей в то время, как у квадрата их 8. Таким образом, у нас уменьшается количество обрабатываемых соседних ячеек, и ввиду того, что мы используем правильные шестиугольники, то расстояние от центра до всех соседей одинаково. Сами координаты для ячеек будем брать по осевой системе


Рис. 1. Отображение координат в проекте.


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

Триангуляция – это разбиение геометрического объекта на треугольники.

     Как видно на предыдущем изображении геометрия шестиугольников не совсем ровная. Для придания неровностей ландшафта используем шум Перлина при создании вершин.

    Следующим шагом в создании карты стала реализация поддержки разных высот у ячеек. Выборочные шестиугольники создаются на разных значениях по оси У. Для проекта установим минимальное и максимальное значение высот как 0 и 5 соответственно. Если сгенерировать меш при таких условиях, то ячейки действительно будут на разных уровнях, но между ними останется пустота. Чтобы решить эту проблему мы соединяем вершины соседних шестиугольников и триангулируем данный переход. Но рассмотрим случаи, когда разница в высотах между ячейками равна 1. Для более красивой картинки и игровой логике, которая подразумевает переход юнитов между такими шестиугольниками, создадим более красивые склоны. Так задав количество террас в переходе мы можем интерполировать высоту каждой вершины на склоне и с определенным шагом получить пороги. Также не обойдется без дополнительной триангуляции полигонов на склоне и стыках между тремя соседними шестиугольниками.

Рис. 2. Изображение триангулированного меша.

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

Рис. 3. Сгенерированный ландшафт.

    На сетке с шестиугольниками можно легко использовать алгоритмы поиска путей. В проекте будем использовать популярный алгоритм А*, который я освещал в предыдущих статьях для квадратной сетки. Благодаря тому, что мы находимся на шестиугольниках, то расстояние до соседей одинаково, а их количество уменьшено на 2, по сравнению с квадратами, это позволяет делать плавную анимацию переходов юнитов из одной ячейки в другую.

Рис. 4. Поиск пути по алгоритму А* на гексогональной сетке.

    Так как, разрабатываемая игра имеет жанр 4х стратегии, то для каждого игрока необходимы территории их владений и соответствующие постройки. Для проекта сделаем объекты, которые будут распространять влияние игрока на соседние ячейки. Эту роль будут играть города, а сами территории, которые находятся под влиянием будем ограничивать кривыми. Так у нас есть список всех ячеек и для созданиях границ нам достаточно создать ломанную по вершинам шестиугольников в заданном порядке. Порядок можно определить проходом по всем имеющимся на территории ячейкам и проверкой их соседей по некоторым правилам. 


Рис. 5. Отображение территориальных границ на сетке.

    Таким образом, решение использовать сетку из шестиугольников пошло на пользу разрабатываемому проекту. Такое представление позволяет добиться приятной картинки, интересных игровых механик и реализации большого количества разных алгоритмов. Так был создан фундамент для последующей моей научно-исследовательской работы, а именно реализации ИИ для ботов в данном проекте.