Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Алгоритмы] Генерация мира (http://www.flasher.ru/forum/showthread.php?t=211024)

ZackMercury 12.06.2015 17:20

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

http://otvet.imgsmail.ru/download/b7...5ef41_i-58.jpg

Итак, идея в чём:

Нужно сделать мир в виде парящего островка.
Размеры островка варьируются от 1200 пкс на 700 до 2500 на 1000.
(при блоке в 25 пкс)

Форма должна быть рандомной, но иметь горы, ямы и что-то в форме сталактитов снизу(разумеется, всё с помощью блоков песка, травы, дерева и т.д.).
Горы между собой могут пересекаться, ямы же не могут пересекаться с горами(хотя, возможно, это не верно - если так не нужно, поправьте меня)

Как я себе это представляю:
1)Генерация квадрата с размерами - 1200 + int(Math.random()*(2500 - 1200)), 700 + int(Math.random()*(1000 - 700)).

2)Разместить скелет, который будет обрастать землёй - полоску земли ровно по вертикальному центру.

3)Задать пределы гор(минимум - 2 горы, максимум - 6)

4)Рандомно определить, сколько будет гор и циклом "нарастить" их в рандомных местах, также размеры гор рандомно.

5)Нарастить ещё некоторую толщу земли, но в местах, прилегающих к границам прямоугольника делать это рандомно.

6)Алгоритм создания ямы
Код:

результирующая точка = Math.random() * ширина прямоугольника;
если(задевает зону горы)
{
  результирующая точка = рекурсия;
}

7) Сталактиты уже более-менее понятно, как реализовать.

Хотелось бы максимально естественно сформировать островок.

MODIFY:

8) Как быть с пещерами - вот вопрос?

MODIFY:

Мысль насчёт пещер - сделать около 50 рандомных точек на карте, и те, что близко друг к другу - объединить коридорами. Но как-то это не очень естественно, жду дальнейших идей.

MODIFY:

Заметил, что, действительно, неверна идея с ямами. Они должны пересекаться и с горами, потому, что горы могут занимать по размерам абсолютно всё пространство на карте(ибо размещение их случайно).
А также это очевидно при взгляде на вставленное изображение.

AlexCooper 12.06.2015 19:11

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

ZackMercury 12.06.2015 19:22

Цитата:

Генерация рельефа в виде анкерных точек вершин и впадин
Генерация контура карты по анкерным точкам
А затем проверять каждые 25 пикселей вхождение в фигуру по каким-то формулам проверки столкновения, и если входит - то рисовать в этом месте блок? Таким образом?
А как быть с кривыми линиями? Есть ли для этого формулы?

Цитата:

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

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

AlexCooper 12.06.2015 20:28

Вложений: 1
Как-то так
01.swf   (4.7 Кб)

AlexCooper 12.06.2015 20:47

Цитата:

Сообщение от ZackMercury (Сообщение 1183513)
как "наращивать" тот или иной климат, например, пустынный, песок, и он постепенно бы переходил в джунгли.
Точнее, ведь горы в пустынях выглядят иначе, чем в горной местности.
В пустынях не встретишь "обрыва".

Степень реалистичности, прямопропорционально ваших способностям к созданию и обработку инструкций

Я бы создал библиотеку рельефов. У каждого рельефа есть два доп. свойства которые указывает есть ли необходимый тип рельефа соседа, или наоборот тот который не может быть смежным с данным.
Естественно каждый рельеф имеет свои интервалы значении генераций по высоте
И создаем основную инструкцию, мол рандомно генерим слева на право, перемешанный список типов рельефов. естественно, если нужно два рельефа гор - в списке 2 типа гор.
Во время каждом проходе генерации, проверяем, есть свойствойсто (не)обязательного типа рельефа-соседа, если есть, выполняем дополнительную итерациию этого типа рельфа, или налаживаем условие, что следующий не может быть каким-то из типов. Теоретически, я бы, наверное сделал так.

ZackMercury 12.06.2015 21:20

AlexCooper, спасибо большое, золотые советы.
Спасибо за интерактивную демонстрацию, помогло понять принцип.

Вот после этого попытаюсь разрисовать все детали сам. Далее покажу результат.

dimarik 14.06.2015 11:07

Я бы применил псевдорандомный генератор. Тогда, зная seed, всегда можно сгенерировать один и тот же ландшафт.

Tails 15.06.2015 09:38

Цитата:

Сообщение от dimarik (Сообщение 1183576)
Я бы применил псевдорандомный генератор. Тогда, зная seed, всегда можно сгенерировать один и тот же ландшафт.

Надо отметить, что так сделано в майнкрафте.

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

AlexCooper 15.06.2015 11:46

Цитата:

Сообщение от dimarik (Сообщение 1183576)
Я бы применил псевдорандомный генератор. Тогда, зная seed, всегда можно сгенерировать один и тот же ландшафт.

Да и я бы так поступил. Хотя и псевдорандом использовал в своей жизни лишь дважды, но для понимания, начинающим, я считаю, будет наиболее простое решение.

GBee 15.06.2015 12:00

Во вконтактике есть игра "Шахты". Для меня вообще вверх программного искусства. Советую.


Часовой пояс GMT +4, время: 23:17.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.