- PVSM.RU - https://www.pvsm.ru -
Если вы любитель игры «Caesar III», то наверняка замечали с то, с каким старанием и вниманием к мелочам сделаны карты кампании, да и свободного режима тоже. Природные пейзажи, на которых игрок возводит «новый Рим», выглядят вполне реалистично (в рамках игры): ручейки впадают в реки и озера, реки текут через всю карту, а в лесах бродят «бессмертные» овцы, иногда забредая на луга и мешая строить фермы, чайки кружат над местами скопления рыбы, а иногда по реке проплывает неудачливый моряк на останках корабля. Скальные массивы окружены деревьями, а земля покрыта ковром сочной зеленой травы. У всей этой чудной картинки есть недостаток, размер карты не превышает 160х160 тайлов, в статье я расскажу как сделал генерацию карт больших размеров.
Оригинальная игра не поддерживает больших карт, так что все опыты проводились в рамках проекта CaesarIA( open-source клона Caesar III(с) ) [2]. Поддержка больших карт в ремейке была с самого начала, но до прочтения хорошей статьи об использовании метода «diamond-square» при построении ландшафтов [3], грузить какие-либо карты, помимо шедших с игрой или сделанных поклонниками, не представлялось возможным. Поняв в каком направлении нужно двигаться, я набрел еще на одну статью о генерации ландшафтов [4], которая окончательно меня убедила в реальности использования этого метода для автоматического создания карты.
Результатом работы исходного алгоритма будет массив точек с высотами, связав высоту с цветом получим такую карту.
[5]
Цвета имеют соответствующие значения:
— синий цвет соответствует воде с большой глубиной,
— посветлее будет означать воду возле берегов,
— желтый будет побережье,
— зеленый означает траву и равнинные территории,
— насыщенным зеленым будет отображатьсф лес,
— серым и темно-серым мелкие и высокие горы соответственно.
При адаптации результатов работы к специфике ландшафта игры, пришлось пересмотреть интерпретацию некоторых значений и настроек, но в целом эти данные подходят для дальнейшей обработки. Теперь можно отобразить полученные значения на карте города, для начала я изменю только тайлы воды и оставлю остальные незакращенными.
[6]
После заливки тайлов воды, можно заполнять траву, лес и горы. Теперь сгенерированная карта уже больше походит на обычную.
[7]
[8]
Оставшаяся большая часть карты по идее должна быть покрыта высокими горами, но тогда она станет непроходима для людей, поэтому я вместо высоких гор опять использую тайлы равнины. На полученной карте остались незаполненными области, прилегающие к воде.
[9]
При заполнении этих областей придется учитывать положение соседей, чтобы выбрать правильную текстуру для конкретного тайла. Игра располагает следующими видами текстур для берега, ориентированного:
— на сервер: 



— на восток: 



— на юг: 



— на запад: 



Такие тайлы определяются по расположению тайлов с водой относительно тайла, для которого проводится вычисление. Например, тайл побережья, ориентированный на сервер, может иметь тайл воды только по направлениям север, северо-восток и северо-запад и их комбинации. Аналогично проводим вычисления для остальных тайлов побережья и не трогаем другие. Результатом будет линия побережья без угловых тайлов.
[10]
Следующий этап состоит в поиске угловых тайлов, которые были пропущены на предыдущем шаге. Такие тайлы имеют тройки соседей (воду) в по направления север->северо-восток->восток, восток -> юго-восток -> юг и аналогиные. Для этображения углов берега в игре есть следующие текстуры:


, разместив их мы получим практически завершенную карту.
[11]
Теперь остались тайлы на воде и на земле, которые не были обработаны на предыдущих этапах. Тайлы которые окружены землей со всех сторон также отнесем к земле, а те что окружены водой — соответственно к воде. Тайлы побережья одновременно считаются и водой и землей. Теперь остается дополнить карту дорогой, чтобы могли приходить поселенцы, и реками, чтобы разнообразить общий пейзаж.
[12]
[13]
Генерация карты размером 500х500 тайлов занимает немного времени, но всетаки существенно больше чем загрузка уже готовых карт. Ниже я разместил скриншот большой карты, размером 3800х1880 пикселей. На такую карту можно добавить разных объектов, поселений и даже город в режиме одиночной игры, но мне видится, что она больше подойдет для сетевой. Еще один из положительных сторон выбранного алгоритма состоит в масштабируемости, можно сохранить результаты вычислений и при необходимости использовать их для расчета соседней территории.
[14]
Конечно сгенерированная карта не сравнится со сделанной человеком, но возможность создавать карты в автоматическом режиме, позволяет еще на шаг продвинуться в создании продолжения и развитии идей заложенныз в оригинальной игре. Вы также можете посмотреть и поучаствовать в развитии ремейка «Caesar III» на странице проекта [2]. Исходный код генератора карт находится здесь [15].
Автор: dalerank
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/65739
Ссылки в тексте:
[1] Image: http://radikal.ru/fp/aa5982eeb5e04b5c843f48a100aa9aa9
[2] CaesarIA( open-source клона Caesar III(с) ): https://bitbucket.org/dalerank/caesaria/overview
[3] статьи об использовании метода «diamond-square» при построении ландшафтов: http://habrahabr.ru/post/111538/
[4] генерации ландшафтов: http://javagamexyz.blogspot.ru/2013/03/terrain-generation.html
[5] Image: http://radikal.ru/fp/ddf3ce236c404675bf7637ff6b5c0460
[6] Image: http://radikal.ru/fp/510204d62f96428990cfd5347a21e7fd
[7] Image: http://radikal.ru/fp/24a4bef3a6d64f3fbe83ea616a9e5255
[8] Image: http://radikal.ru/fp/2303262f96224d46b3626ffa06ae7697
[9] Image: http://radikal.ru/fp/4bae52a5df5449128fe99e7a82dd9bda
[10] Image: http://www.radikal.ru
[11] Image: http://radikal.ru/fp/b5171dd0226a4518850282458c3d7a38
[12] Image: http://radikal.ru/fp/012a42fabb184e82b3cb3982408a3951
[13] Image: http://radikal.ru/fp/f878a5d238f64192ac94cf52543177c8
[14] Image: http://fastpic.ru/view/66/2014/0723/_7520e0a542c5d07208f3dacf31d78654.jpg.html
[15] здесь: https://bitbucket.org/dalerank/caesaria/src/bacab31cbf7593c3f2e220aaf0e1937bfb20a482/source/city/terrain_generator.cpp?at=master
[16] Image: http://radikal.ru/fp/09a6dd59a93444b2b9fb5303b896ed47
[17] Image: http://radikal.ru/fp/e304d0eb27324d4aaec6b92ea2774113
[18] Image: http://radikal.ru/fp/6fba78d366f44005beada7c5cd7607af
[19] Image: http://radikal.ru/fp/94268f68568d440b8253ac2eb3def73c
[20] Источник: http://habrahabr.ru/post/230829/
Нажмите здесь для печати.