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