Процедурне покоління нескінченного рівня


16

Які є хороші підходи до процедурного генерування нескінченного рівня 2d? Рівень може бути обмежений у будь-якому вимірі, але не обов'язково.

Підхід, який має для мене найбільше сенс, - це використання радіуса на основі сітки. наприклад, розділіть ігрову область на сітку з квадратами певного розміру, а потім завантажте X квадратів у радіусі навколо гравця. Потім, коли гравець переходить на інший квадрат, побудуйте наступний набір і опустіть далі (Залишається досліджувана область не потрібна.) Коли квадрат побудований, він містить випадкове розташування об'єктів. Коли предмети залишають зовнішнє кільце квадратів, вони видаляються із світу. Чи є кращі чи різні способи? Або якщо це хороший підхід, які потенційні проблеми?

Для обговорення ви можете розглядати рівень як астероїдне поле зверху вниз з розмитненнями живлення тощо.


2
Це , здається, пов'язане: gamedev.stackexchange.com/questions/2230 / ...
jacmoe

^ і таким чином він знаходиться у стовпці "Пов'язані" праворуч. Не потрібно зв'язуватися.
Ricket

7
А потім воно стало «пов’язаним» так само, як і «спорідненим» - акуратним, так? :)
jacmoe

Відповіді:


6

Проблема з "нескінченними" світами полягає в тому, що ваші основні координати можуть бути нескінченними. Іноді, якщо гра достатньо сповільнить гравця, це може не викликати занепокоєння, оскільки, наприклад, час досягти цілої цілої упаковки буде занадто довгим, щоб її не досягти. Але якщо ви допускаєте великі перепади швидкостей, вам, можливо, доведеться бути дуже точними та далекосяжними, що вам потрібно буде подумати про свої координати. Доцільним виправленням буде наявність двох рівнів, таких як цілі координати вашої сітки та плаваючі координати у кожній референсній сітці.

На відміну від вас, можливо, ви навіть зможете належним чином зберегти макет свого світу, використовуючи координати сітки як насіння, щоб створити свій випадковий світ у заданому квадраті. Отже, коли гравець покидає область, ви можете її скинути, а коли гравець повернеться, ви зможете відновити її назад із насіння.


4
Цю проблему можна обійти, періодично зосереджуючи світ.
Джонатан Фішофф

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

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

До речі, це те саме рішення, що і в комп'ютерній версії Minecraft :) +1 для фіксованого цілого числа + float, що, на мій погляд, найкраще рішення
GameDeveloper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.