Генератор бесконечного мира

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

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

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

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


person noisy cat    schedule 09.07.2012    source источник


Ответы (2)


Это, вероятно, неправильный способ сделать это, но может дать вам некоторые идеи. то, что вы могли бы сделать, это сохранить в памяти двумерный массив фрагментов 3x3 или даже массив фрагментов 5x5. Обновление этих чанков и того, какие чанки загружаются в зависимости от позиции игрока. Остальной мир может храниться в файле, который читается и записывается. Когда игрок перемещается в пределах 2-3 чанков от неинициированного чанка или пустого чанка, сгенерируйте этот чанк, используя любой метод, который вы хотите.

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

Во всяком случае, это то, что я вижу в Minecraft.

person Sakamoto Kazuma    schedule 09.07.2012
comment
основная проблема в том, что я не могу генерировать пейзаж по горизонтали :( Есть алгоритмы, как это сделать? - person noisy cat; 09.07.2012
comment
Создайте ландшафт для каждого фрагмента, а затем сопоставьте их позже или в процессе генерации. Я не знаю никаких алгоритмов, которые сделают это за вас. - person Sakamoto Kazuma; 09.07.2012

Эти проблемы были решены в реализациях Conway's Life.

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

http://www.drdobbs.com/jvm/an-algorithm-for-compressing-space-and-t/184406478

http://en.wikipedia.org/wiki/Hashlife

http://golly.sourceforge.net/

http://tomas.rokicki.com/hlife/

http://www-users.cs.york.ac.uk/~jowen/hashlife.html

person user15972    schedule 09.07.2012
comment
Хорошо, но я до сих пор не знаю, как хранить и генерировать куски, и это то, что я имею в виду. - person noisy cat; 09.07.2012