Proceduralne generowanie nieskończonego poziomu

16

Jakie są dobre podejścia do proceduralnego generowania nieskończonego poziomu 2d? Poziom można ograniczyć w dowolnym wymiarze, ale niekoniecznie.

Podejście, które do tej pory ma dla mnie największy sens, polega na zastosowaniu promienia opartego na siatce. np. podziel obszar gry na siatkę z kwadratami określonego rozmiaru, a następnie załaduj X kwadratów w promieniu wokół gracza. Następnie, gdy gracz przechodzi na inny kwadrat, zbuduj następny zestaw i upuść dalej (Utrzymanie eksplorowanego obszaru nie jest konieczne.) Kiedy kwadrat jest budowany, zawiera on losowy układ obiektów. Kiedy obiekty opuszczają zewnętrzny pierścień kwadratów, są usuwane ze świata. Czy są lepsze lub inne sposoby? Lub jeśli jest to dobre podejście, jakie są potencjalne problemy?

W trosce o dyskusję, możesz myśleć o tym poziomie jak o polu asteroid z góry na dół z rozproszonymi dopalaczami itp.

Colin Gislason
źródło
2
Wygląda na to, że jest to powiązane: gamedev.stackexchange.com/questions/2230/…
jacmoe
^ i dlatego znajduje się w kolumnie „Pokrewne” po prawej stronie. Nie trzeba linkować.
Ricket
7
A potem stało się „powiązane” i „powiązane” - schludnie, co? :)
jacmoe,

Odpowiedzi:

6

Problem z „nieskończonymi” światami polega na tym, że współrzędne leżące u ich podstaw mogą nie być nieskończone. Czasami, jeśli gra wystarczająco spowolni gracza, może to nie stanowić problemu, ponieważ na przykład czas na osiągnięcie liczby całkowitej jest zbyt długi, aby można go było kiedykolwiek osiągnąć. Ale jeśli pozwolisz na duże różnice prędkości, być może będziesz musiał być bardzo precyzyjny i bardzo dalekosiężny, abyś musiał pomyśleć o swoich współrzędnych. Rozsądnym rozwiązaniem byłoby posiadanie dwóch poziomów, takich jak współrzędne całkowite twojej siatki i współrzędne zmiennoprzecinkowe w każdej linii odniesienia.

Na marginesie, możesz być nawet w stanie poprawnie zachować układ swojego świata, używając współrzędnych siatki jako ziarna do stworzenia losowego świata na danym kwadracie. Kiedy więc gracz opuści obszar, możesz go upuścić, a gdy gracz wróci, możesz go zregenerować z nasion.

mała kaczka
źródło
4
Problem ten można obejść, od czasu do czasu centrując świat.
Jonathan Fischoff,
Należy również pamiętać nie tylko o zawijaniu liczb całkowitych, ale także o niedokładności małych zmian zmiennoprzecinkowych, gdy liczba zmiennoprzecinkowa jest wysoka. Spróbuj tego: float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos; na moim komputerze diff wynosi 0
tenpn
To są wszystkie dobre punkty. Wydaje mi się, że właściwe byłoby ponowne wprowadzanie współrzędnych za każdym razem, gdy generowany jest nowy zestaw kwadratów, o ile jest on wystarczająco wydajny.
Colin Gislason,
Nawiasem mówiąc, jest to to samo rozwiązanie, co w wersji na PC Minecraft :) +1 dla stałej liczby całkowitej + liczba zmiennoprzecinkowa, która moim zdaniem jest najlepszym rozwiązaniem
GameDeveloper