Prozedurale Erzeugung einer unendlichen Ebene


16

Was sind einige gute Ansätze zur prozeduralen Generierung einer unendlichen 2d-Ebene? Die Ebene kann in beiden Dimensionen eingeschränkt sein, muss aber nicht.

Der für mich bisher sinnvollste Ansatz ist die Verwendung eines gitterbasierten Radius. Teilen Sie z. B. den Spielbereich in ein Raster mit Quadraten einer bestimmten Größe und laden Sie dann X Quadrate in einem Radius um den Spieler. Wenn der Spieler dann zu einem anderen Feld wechselt, baue das nächste Set und lasse es weiter fallen (es ist nicht erforderlich, das erkundete Gebiet fortzusetzen). Wenn ein Feld gebaut wird, enthält es eine zufällige Anordnung von Objekten. Wenn Objekte den äußeren Quadratring verlassen, werden sie aus der Welt entfernt. Gibt es bessere oder andere Wege? Oder wenn dies ein guter Ansatz ist, was sind mögliche Probleme?

Aus Diskussionsgründen können Sie sich das Level als ein Asteroidenfeld von oben nach unten mit Power-Ups usw. vorstellen.


2
Dies scheint in Beziehung gesetzt werden: gamedev.stackexchange.com/questions/2230/...
jacmoe

^ und so steht es in der "Related" -Spalte auf der rechten Seite. Keine Notwendigkeit zu verlinken.
Ricket

7
Und dann wurde es "verknüpft" und "verbunden" - ordentlich, oder? :)
jacmoe

Antworten:


6

Ein Problem mit "unendlichen" Welten ist, dass Ihre zugrunde liegenden Koordinaten möglicherweise nicht unendlich sind. Manchmal, wenn das Spiel den Spieler genug verlangsamt, könnte es kein Problem sein, da die Zeit zum Erreichen des ganzzahligen Umlaufs zum Beispiel viel zu lang wäre, um jemals erreicht zu werden. Wenn Sie jedoch große Geschwindigkeitsunterschiede zulassen, müssen Sie möglicherweise sowohl sehr präzise als auch sehr weitreichend sein, damit Sie über Ihre Koordinaten nachdenken können. Eine vernünftige Lösung wäre, zwei Ebenen zu haben, z. B. die Ganzzahlkoordinaten Ihres Rasters und die Gleitkoordinaten in jedem Gitterbezug.

Abgesehen davon könnten Sie sogar in der Lage sein, das Layout Ihrer Welt korrekt beizubehalten, indem Sie die Gitterkoordinaten als Ausgangswert verwenden, um Ihre zufällige Welt in einem bestimmten Quadrat zu erstellen. Wenn der Spieler das Gebiet verlässt, kannst du es fallen lassen, und wenn der Spieler zurückkommt, kannst du es aus dem Samen regenerieren.


4
Dieses Problem kann umgangen werden, indem die Welt gelegentlich zentriert wird.
Jonathan Fischoff

Beachten Sie auch nicht nur den ganzzahligen Umlauf, sondern auch die Ungenauigkeiten kleiner Gleitkommaänderungen, wenn die Gleitkommazahl hoch ist. Versuchen Sie float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos;
Folgendes

Das sind alles gute Punkte. Ich halte es für angebracht, die Koordinaten jedes Mal neu zu zentrieren, wenn eine neue Menge von Quadraten generiert wird, solange dies effizient genug ist.
Colin Gislason

Dies ist übrigens die gleiche Lösung wie in der PC-Version von Minecraft :) +1 für feste Ganzzahl + Float, was meiner Meinung nach die beste Lösung ist
GameDeveloper
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.