Zufällige Kartengenerierung

63

Ich starte / starte ein 2D-Tilemap-RPG-Spiel in Java und möchte eine zufällige Kartengenerierung implementieren. Ich habe eine Liste verschiedener Kacheln (Dreck / Sand / Stein / Gras / Kies usw.) zusammen mit Wasser- und Pfadkacheln. Das Problem ist, dass ich keine Ahnung habe, wo ich anfangen soll, zufällig eine Karte zu erstellen.

Es müsste Geländeabschnitte geben (wie ein Teil davon Sand, ein Teil Dreck usw.). Ähnlich wie in Minecraft gibt es verschiedene Biome, die sich nahtlos ineinander verwandeln. Zuletzt müsste ich auch zufällige Pfade hinzufügen, die in verschiedene Richtungen über die Karte verlaufen.

Ich bitte niemanden, mir den gesamten Code oder irgendetwas zu schreiben, piont mich einfach in die richtige Richtung, bitte.

tl; dr - Generiere eine Kachelkarte mit Biomen, Pfaden und stelle sicher, dass die Biome nahtlos ineinander übergehen.

Tom O.
quelle

Antworten:

68

Unter den vielen anderen verwandten Fragen auf der Website gibt es einen häufig verlinkten Artikel zur Kartenerstellung: Polygonale Kartenerstellung für Spiele Sie können einige gute Strategien aus diesem Artikel entnehmen, aber er kann nicht so verwendet werden, wie er ist.

Es ist zwar kein Tutorial, aber es gibt einen Artikel darüber, wie Zwergenfestungs-Weltkarten erstellt werden. Grundsätzlich erzeugen Sie mehrere Lärmschichten für Höhe, Feuchtigkeit, Temperatur und Salzgehalt. Dann würden Sie so etwas verwenden:

Bildbeschreibung hier eingeben

Oder dieses

Bildbeschreibung hier eingeben

um auf der Grundlage der zuvor erzeugten Lärmschichten Biome zu erzeugen. Typischerweise ergibt dies einen ziemlich glatten Übergang zwischen den Biomen und die Übergänge sind logisch. Ich ändere auch die Feuchtigkeits- und Temperaturkarten basierend auf der Höhe. Dies erzeugt natürlich eine "Waldgrenze" und erzeugt felsige Berge mit schneebedeckten Kappen.

Ich verwende diese Strategie für mein Spiel und es erzeugt sehr schnell Karten wie diese:

Bildbeschreibung hier eingeben

Außerdem kann ich am Anfang dieses Videos ein paar weitere Karten durchblättern .

Und hier noch ein paar mehr, um Ihnen den Einstieg zu erleichtern:

Wie kann ich eine zufällige "Welt" in einer Kachel-Engine erstellen?

Wie kann ich Feature-Regionen in einer prozedural generierten Welt identifizieren?

Wie erstelle ich flächendeckende Geräusche für die Kartengenerierung?

MichaelHouse
quelle
Obwohl dieser Link zur polygonalen Kartengenerierung für Spiele ein sehr schöner Artikel ist, finde ich, dass er nicht sehr gut zu dieser Frage passt, weil a) es kein Tilemap-Gitter ist und b) es keine Biome hat - die Geländetextur ist basierend auf der Höhe.
Tapio
@ Tapio Du hast recht, ich habe mit mehr Informationen aktualisiert.
MichaelHouse
@Byte56 Danke, all das gibt mir einen Ausgangspunkt! :)
Tom O
@Byte56 Ich habe bemerkt, dass Sie meine Frage vor ein paar Jahren erwähnt haben, also habe ich sie mit funktionierendem Code aktualisiert!
Nick Badal
1
Übrigens wurde das Projekt zur Generierung von Polygonkarten für ein Spiel erstellt, das eine Kachelkarte hatte, auf der die Höhen nicht angezeigt wurden. Die Höhen und Polygone sind dazu da, die Biome zu erzeugen, aber sie werden im Spiel nicht angezeigt.
amitp
29

Während die anderen Antworten hier wirklich gut für die Erzeugung der Arten von statischen Landschaften sind, die für dieses spezielle Bedürfnis funktionieren würden. Es gibt andere Methoden, nach denen Menschen suchen, die auf diese Frage stoßen, wenn sie Landschaften erstellen möchten, die sich im Laufe der Zeit ändern oder viel realistischer erscheinen.

Im Gegensatz zu den anderen Antworten beginnen Sie dies mit einer völlig leeren Karte. Beginnen Sie mit dem, was Sie als Meeresspiegel betrachten würden. Verwenden Sie Perlin-Rauschen , um geringfügige Abweichungen hinzuzufügen. Wenn Sie 256 mögliche Höhen haben, variieren Sie nicht mehr als 3-5 in beide Richtungen. Auf diese Weise werden die ersten paar Milliarden Jahre Ihrer Landschaft erstellt, ohne dass eine Simulation so lange ausgeführt werden muss.

Plattentektonik

Teilen Sie die Karte entlang gerader oder gebogener Linien, um Platten zu erstellen. Je detaillierter die Formen der Platten sind, desto interessanter wird Ihre Landschaft. Halte sie groß. Geben Sie jeder Platte eine Richtung, Geschwindigkeit. Bewegen Sie die Platten über einen bestimmten Zeitraum schrittweise um die Karte und ziehen Sie alle Kacheln darüber mit sich.

Wenn sich zwei Platten kreuzen, treffen Sie eine Auswahl, welche über- und welche untergehen. Diese Auswahl kann zufällig sein. Fliesen auf unter bezeichneten Platten werden sofort um 5 Stufen in der Höhe reduziert. Sobald eine Platte über oder unter einer Platte benannt wurde, werden alle zukünftigen Interaktionen mit Platten diesen Regeln folgen:

  • Wenn eine bestimmte Platte eine nicht bezeichnete Platte kreuzt, wird die nicht bezeichnete Platte zum entgegengesetzten Typ. (So ​​werden UD-Platten beim Überqueren eines Over unter.)
  • Wenn eine Überplatte über einer Unterplatte liegt, bewegen sich alle diese Kacheln um 0-1 Höhenstufen nach oben, und die Kacheln folgen dem Weg der Überplatte.
  • Wenn eine Überplatte eine Überplatte kreuzt, bewegen sich alle diese Kacheln 1 bis 2 Schritte nach oben, und die Kacheln in der Überkreuzungsregion driften nicht mehr.
  • Wenn eine Unterplatte eine Unterplatte überquert, bewegen sich alle Kacheln im Bereich mit einer Höhe von mehr als 66% für beide Platten in der Überkreuzungsregion um 1 bis 3 Stufen nach oben (wie durch vulkanische Aktivität entstehen so über einen ausreichenden Zeitraum Inseln) ) und Fliesen in diesem Bereich hören auf zu treiben.

Alle Platten, die sich kreuzen, verlangsamen sich bei jedem Schritt um 20% ihrer aktuellen Geschwindigkeit. Fügen Sie für zusätzlichen Realismus bei jedem Schritt eine zufällige Änderung der Bewegungsrichtung von -10% bis 10% hinzu.

Nach der gewünschten Anzahl von Schritten. Wahrscheinlich sind 5-10 genug. Alle Kacheln, auf denen sich keine Platten befinden, sollten auf die niedrigste vorhandene Ebene fallen gelassen werden.

Groß oder klein?

Diese Karte kann unverändert verwendet oder erweitert werden, um eine viel größere Karte zu erstellen, indem sie in 4X4-Kacheln (Zellen) aufgeteilt und diese Abschnitte auf der Grundlage ihrer individuellen Höhen erweitert werden. Behandeln Sie die Höhe jeder Zelle als Punkt und erstellen Sie eine glatte Abstufung in der größeren Karte zwischen diesen Punkten. Wenn also die größere Karte 40 × 40 statt 4 × 4 ist und Punkt (0,0) 10 und Punkt (0,1) 1 ist, sind die Kacheln auf der größeren Karte zwischen ihnen 10,9,8,7,6 , 5,4,3,2,1 in der Höhe. Weitere Perlin-Geräusche können hinzugefügt werden, um die Pisten zu glätten. Insgesamt ist diese Skalierungstechnik dem Diamond Square- Algorithmus ähnlich .

Wasser

Um Flüsse und Seen, Ozeane und Grundwasserspiegel zu simulieren. Ich bevorzuge es, zellulare Automaten zu verwenden .

Höhen werden zu Floats oder erweiterten Int-Bereichen, um eine feinkörnigere Verfolgung zu ermöglichen. Wasserzellen haben Sättigungswerte, beispielsweise im Bereich von 1 bis 256. Die Karten sollten gleichmäßig starten. Sie müssen mit den Zahlen für Ihre individuellen Kartengrößen spielen. Im Allgemeinen befolgen Sie jedoch die folgenden Regeln:

  • Wenn eine Nachbarzelle gesättigter ist, erhöhen Sie die Sättigung und gewinnen Sie an Höhe.
  • Wenn eine Nachbarzelle weniger gesättigt ist, verringern Sie die Sättigung und verlieren an Höhe.

Machen Sie diese Überprüfung für jede benachbarte Zelle. Führen Sie eine ausreichende Anzahl von Schritten durch. Wenn Sie möchten, können Sie dieser Simulation eine Temperatur hinzufügen, indem Sie den Betrag der verlorenen / gewonnenen Sättigung um diese Temperatur ändern. Sie können es auch basierend auf der Höhe ändern. Es sollten sich natürliche Seen und Flüsse bilden. Einige werden in den Ozean fallen. (Der Ozean füllt sich wahrscheinlich nicht mit einer Metrik, aber Sie bezeichnen alles unter dem Meeresspiegel sowieso als wassergefüllt.)

Sie können die Temperatur- und Sättigungsdaten beibehalten, um wie in den anderen Antworten zum Erstellen von Biomen verwendet zu werden. Sie sollten VIEL genauer und interessanter sein. Mit schneebedeckten Biomes an den Polen und heißen in der Mitte (wenn Sie eine glatte abgestufte Temperaturliste verwenden).

Sie können auch Wind und damit Temperaturänderungen anhand der Höhen simulieren. Sie können zwischen der Temperatursimulation und der Wassersimulation wechseln, wenn Sie möchten. Ich habe jedoch noch nichts mit Temperaturänderungen gebaut, daher werde ich nicht darauf eingehen, wie das geht.

Sich entwickelnde Landschaften

Wenn Sie die Simulationen für Land, Wasser und Wärme beibehalten und deren Auswirkungen drastisch reduzieren und die Bewegung der Platten stoppen, können Sie alle diese Metriken im Laufe der Zeit weiter ändern. Ich würde die Berechnungen nicht oft durchführen, aber Sie können eine Weltkarte erhalten, die auf diese Weise auf Änderungen reagiert.

Fazit

Während diese Art von Techniken weitaus aufwendiger sind, erzeugen sie viel realistischere und sich entwickelnde Effekte. Nehmen Sie es für das, was es wert ist?

DampeS8N
quelle
15

Sie können Perlin Noise für die Erzeugung des Geländes verwenden. So funktionieren die Biome in Minecraft. Wie Sie sehen, verwendet er eine Heatmap in Kombination mit einer Rainmap, um die Biomes zu erstellen.

Biomes von Minecraft

tversteeg
quelle