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.
quelle
Antworten:
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.
quelle
float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos;