LINUX.ORG.RU

генератор карт.

 


0

2

Как сделать годный генератор карт? Сейчас у меня какая-та чушь. Например если локация лес, то открывается файл forest, от туда берутся объекты которые там могут быть. И создается случайно количество объектов. Чушь же. Какие есть варианты получше?

причём тут с++? Есть много открытых игр с такой фичей - бери сорцы и смотри как там сделано. Например, openttd.

mashina ★★★★★
()

на правах альтернативы: запили удобный редактор уровней лучше. тогда юзеры сами делать их начнут.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

ок. но все же нужно сделать так что бы они и сами генерировались.

nickionn ★☆
() автор топика

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

Dragon59 ★★
()
Ответ на: комментарий от Dragon59

Если нет, то просто разбрасываешь объекты с нужной степенью разряженности.

а то как сейчас работает, норм?

Для начала нужны карты путей.

сейчас просто стоит метка что через него нельзя проходить.

nickionn ★☆
() автор топика
Ответ на: комментарий от nickionn

сейчас просто стоит метка что через него нельзя проходить.

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

Dragon59 ★★
()
Ответ на: комментарий от Dragon59

меня интересует не как работает, а реализация.

nickionn ★☆
() автор топика

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

Deleted
()

Для рогалика? Если локация не подземелье, то случайно расставляй деревья, и т.д. Для подземелья генератор лабиринтов - их тысячи. Для комнат+коридоров - BSP, самая примитивная версия наверное в NetHack'e, на nethackwiki видел описание. Можешь также посмотреть исходники libtcod - библиотеки для разработки рогаликов.

Array
()

есть алгоритм где случайно точки кидаются на карту, потом ее пячат по этим точкам на треугольники а потом по их площади ставят высоту или еще какой параметр

ckotinko ☆☆☆
()

решил сделать так. Генерировать случайно число. Из него получать какой тип локации будет. И если например выпал лес, то следовать такому алгоритму, а если например город то другому. Но тогда получается много кода. Пойдет или не?

nickionn ★☆
() автор топика
Ответ на: комментарий от Deleted

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

вот ты не мог бы конкретных манов накидать?
тоже интересна тема, но не разбираюсь совершенно

seed_stil ★★
()

Какие есть варианты получше?

http://habrahabr.ru/post/111538/

http://www.nolithius.com/game-development/world-generation-breakdown

Самый простой описан тут: http://rlgclub.ru/forum/viewtopic.php?f=7&t=32

4 вида ландшафта, разность высот не рассматривается. 

Простой фрактальный генератор ландшафта 

Принцип работы: 

1. Строим квадрат 2*2, заполняем: 

1 2
3 4


2. Увеличиваем квадрат в два раза:

1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4


3. Подставляем во все поля кроме угловых значения случайной соседней клетки, получаем что-то вроде

1 2 2 2
1 1 4 2
3 2 1 4
3 3 3 4


4. Повторяем с пункта 2, пока размеры не начнут нас устраивать.

Примечание: только угловые клетки [0;0],[0;n],[n;0],[n;n] не изменяются (n-текущий размер карты),

увеличение квадрата в два раза означает замену точки на блок из четырёх

1 2 2 2
1 1 4 2
3 2 1 4
3 3 3 4

преобразуется в

11 22 22 22
11 22 22 22

11 11 44 22
11 11 44 22

33 22 11 44
33 22 11 44

33 33 33 44
33 33 33 44

далее транформация п.3. - размытие

anonymous
()
Ответ на: комментарий от seed_stil

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

Deleted
()
Ответ на: комментарий от Deleted

можно проще, не учить геологию, а взять мелкомасштабную карту какого-нибудь реального подходящего куска ландшафта и с него нагенерить :) или на шаблоны порезать и потом из них склеивать карты побольше

Harald ★★★★★
()

Сделай послойный генератор.
У меня он в Лорландии работает процентами.

Трава 100%. 1 слой.
Реки 3% протяженность рек 55%*размер локации. 2 слой.
Деревья 40% разряженность 5 клеток например. 3 слой.
Постройки 2%. 4 слой.
Мобы 3% указываем типы мобов 1 2 3 4 5. 5 слой.

А пути не нужны. У меня мобы умеют сами отличать объекты.

VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

Слои если не понял работают так:
Создаем файл карты.
Генерим первый слой - записываем.
Генерим второй слой - записываем поверх первого.
Генерим третий слой - записываем поверх первого, второго.
etc.

VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

Ну и проценты и есть рандом.
Просто задай разумные ограничения чтобы у тебя мобов не было больше ёлок в локации.

VictimOfLoveToLinux
()
Ответ на: комментарий от nickionn

Зачем ты это хочешь реализовать на уровне карт?
Это должно быть на уровне работы с объектами.

Объект А заменяет Объект Б.
В твоем примере дерево заменит трава.

VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

Вот для этого нужна система координат.
Чтобы каждая клетка имела свой номер.

Я это сделал так:

 x_y = char_y+char_x*80 

Те берем координату y и x и умножаем на 80 и вуаля. Теперь любая клетка имеет свой уникальный номер которым можно оперировать.
Дальше клетка сообщает нам кто она такая и всё. Всё просто.
Я это в туалете придумал :з

VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

А почему не y*80? Я понимаю, что разницы нет, но ведь логичнее работать со строками и 80 - это как раз ширина терминала, не?

winlook38 ★★
()
Ответ на: комментарий от winlook38

80 - это как раз ширина терминала, не?

не

nickionn ★☆
() автор топика
Ответ на: комментарий от VictimOfLoveToLinux

Ну я и говорю, что логичнее работать со строкой. Первая строка: 0*80 + х, вторая 1*80 + x и т.д. А у тебя получается работа со столбцами.

winlook38 ★★
()
Ответ на: комментарий от VictimOfLoveToLinux

80 просто число удобное для создания рандомного числа для клетки.

а я думал для таких случаев когда x=1, а y>a. Думал 80х80 макс размер карты.

nickionn ★☆
() автор топика
Ответ на: комментарий от nickionn

Слишком замудрено я специально выбрал такой простой вариант.
Вообще минимум проблем и на выходе нужный результат.

Но каждый делает как хочет. Просто это мой рабочий вариант, поэтому я им и поделился.

VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

Трава 100%. 1 слой.
Реки 3% протяженность рек 55%*размер локации. 2 слой.
Деревья 40% разряженность 5 клеток например. 3 слой.
Постройки 2%. 4 слой.
Мобы 3% указываем типы мобов 1 2 3 4 5. 5 слой.

а если карта не лес? как у тебя код устроен? так?

if(map==forest){
//что то сделать
}
if(map==city){
//сделать то то.
}
nickionn ★☆
() автор топика
Ответ на: комментарий от VictimOfLoveToLinux

не надо ни умножать ни складывать.

nickionn ★☆
() автор топика
Ответ на: комментарий от nickionn

Нет. Не так.

Есть параметры локации.
Они перманентны, верно ведь? Локация с названием «Пустыня Васи» никогда не будет цветущим раем.
Значит если у нас есть пустыня нам надо по мимо травы замутить и песок.
Те делаем 2 объекта. В конечном итоге их может быть и 10 и 20.

# трава
# песок

Делаем траве зеленый цвет, песку желтый.

Далее генератор обращается к конфигу локации.
И опрашивает его.
Конфиг отдает ему свои значения.

Те значение:

земля = песок
Принял генератор это значение.
У себя в коде уже находит покрытие земли Песок.
И генерит вместо земли песок.

В конфиге можно указать что угодно.
В том числе и твой вопрос. Вместо рек будем генерить каменные дороги, вместо деревьев дома.

Задавай отдельные подклассы.

Земли:
-трава
-песок
-камень
etc

Объекты:
-деревья
-камни
-дома
-мусор
етк

Динамические объекты:
-реки
-озера
-дороги
-тропы
-огонь
-обрывы
-горы
етк

VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

ну у меня есть файлы. например в ground есть

normalland . 1 COLOR_YELLOW COLOR_BLACK

там хранится имя, каким символом выводится, цвет палитры, и цвета. А у тебя все хранится в сорцах?

nickionn ★☆
() автор топика
Ответ на: комментарий от nickionn
#!/usr/bin/python
# -*- coding: utf-8 -*-

c1='\033[1;36m' ##голубой
c1e='\033[1;m' ##голубой

c1_text = 'Это голубой цвет.'
print c1, c1_text, c1e
per =  '\033[1;36mЯ голубой цвет для Ъ.\033[1;m'
print per
VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

У меня уже в переменной задан свой цвет.
Если нужен меняющийся у меня они тоже есть как отдельные переменные.
Как в примере c1_text.

VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

ну ты складываешь x и y а потом умножаешь на 80. Как ты из этого числа обратно координаты получишь?

nickionn ★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.