Процедурное Поколение Бесконечного Уровня


16

Каковы некоторые хорошие подходы к процедурной генерации бесконечного 2d уровня? Уровень может быть ограничен в любом измерении, но не обязательно.

Подход, который имеет для меня наибольшее значение, использует радиус на основе сетки. Например, разделите игровую зону на сетку с квадратами определенного размера, а затем загрузите квадраты Х в радиусе вокруг игрока. Затем, когда игрок переходит к другому квадрату, строит следующий набор и опускается дальше (Сохранение исследуемой области не требуется.) Когда квадрат построен, он содержит случайное расположение объектов. Когда объекты покидают внешнее кольцо квадратов, они удаляются из мира. Есть ли лучшие или другие способы? Или, если это хороший подход, каковы потенциальные проблемы?

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


2
Похоже, это связано с: gamedev.stackexchange.com/questions/2230/…
jacmoe

^ и, таким образом, он находится в столбце «Связанные» на правой стороне. Нет необходимости в ссылке.
Рикет

7
И затем это стало "связанным" так же как "связанным" - опрятный, а? :)
Жакмо

Ответы:


6

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

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


4
Эту проблему можно обойти, периодически центрируя мир.
Джонатан Фишофф

Также следует помнить не только о целочисленном переносе, но и о неточностях небольших изменений с плавающей запятой, когда число с плавающей запятой велико. Попробуйте это: float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos; на моей машине diff равно 0.
tenpn

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

Кстати, это то же решение, что и в версии Minecraft для ПК :) +1 для фиксированного целого числа + float, которое, на мой взгляд, является лучшим решением
GameDeveloper
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.