Я хотел бы создать игру с бесконечным (на самом деле очень большим) миром, в котором игрок может передвигаться. Вопрос о том, удастся ли мне когда-нибудь реализовать игру, зависит от меня, но я нахожу эту идею интересной и хотел бы узнать, как это сделать.
Суть в том, чтобы иметь мир, в котором все данные генерируются случайным образом по запросу, но детерминированным способом.
В настоящее время я сосредотачиваюсь на большой 2D-карте, на которой должна быть возможность отображать любую часть без знания окружающих частей.
Я реализовал прототип, написав функцию, которая дает случайное, но детерминированное целое число с учетом x и y пикселя на карте (см. мой недавний вопрос об этой функции). Используя эту функцию, я заполняю карту "случайными" значениями, а затем сглаживаю карту, используя простой фильтр на основе окружающих пикселей. Это делает карту зависимой от нескольких пикселей за ее краем, но это не большая проблема. Конечный результат - это то, что, по крайней мере, выглядит как карта (особенно с хорошей цветовой картой высоты). Учитывая это, можно сначала создать более грубую карту, которая используется для создания больших различий в высоте для создания горных цепей и морей.
В любом случае, это была моя идея, но я уверен, что уже есть способы сделать это, и я также считаю, что, учитывая спецификацию, многие из вас могут придумать лучшие идеи.
EDIT: Забыли ссылку на мой вопрос.
ОБНОВЛЕНИЕ 2: Думаю, мне нужно пояснить, что важно, чтобы две смежные части карты, созданные отдельно, должны были плавно соединяться друг с другом.
ОБНОВЛЕНИЕ 3: В комментариях была запрошена дополнительная информация.
Вот изображение, взятое со страницы о фрактале и Perlin Noise, которое очень похоже на то, что я создал ранее (поскольку моя лучшая попытка, вероятно, использовала Perlin Noise):
Подумайте о черных пикселях, как о глубоком море, а белые - о горных вершинах. Это то, что мне нужно, простая двухмерная карта высот.
То, что я хочу сделать, это выбрать любой прямоangularьник из очень большого мира (в диапазоне MAXINT * MAXINT пикселей) и сгенерировать его. Если бы я сгенерировал какую-либо часть изображения выше, он должен получить точно такие же пиксели, как если бы я сгенерировал большую часть, охватывающую меньшую.
Теперь к неразумным вопросам:
Требуемая производительность. Моя главная цель - пошаговая RPG, поэтому производительность может быть довольно низкой, но я думаю, что было бы очень интересно узнать, возможно ли создать быстрый алгоритм.
Требования к памяти: желательно, чтобы ничего не создавалось заранее, но, кроме этого, использование памяти должно соответствовать любой обычной игре или приложению.
Необходимые детали: ну, если вы посмотрите на изображение, вы получите идею. Было бы очень хорошо, если бы можно было уменьшить масштаб и панорамировать без необходимости сначала рассчитывать карту с максимально увеличенным уровнем.
Необходимые типы объектов и свойства объектов для генерации: Ничего особенного, я доволен ландшафтом в соответствии с изображением выше. Но я признаю, что думал о подобной установке, где все очень очень большой город. Это был бы другой вопрос.
ОБНОВЛЕНИЕ 4: Надеюсь, последний.
Хорошо, после прочтения кажется, что Perlin Noise - это то, что нужно. У меня есть еще один вопрос (если кто-то захочет ответить сейчас, когда я принял один (фактически два) ответа :)).
Функция шума Перлина принимает удвоение. Какой диапазон у этих двойников? [0-1 [? Или я могу с радостью отправить мои большие целые числа?