Wie kann ich einen (relativ) linearen Dungeonpfad generieren?

8

Wir entwickeln ein Konzept für einen Action Side-Scroller. Was wir brauchen, ist eine Möglichkeit, eine (relativ) gerade Karte zu erstellen. Damit meine ich so etwas wie ...

Geben Sie hier die Bildbeschreibung ein

Es ist klar zu sehen, dass diese Karte einer einfachen Route folgt, auch wenn sie etwas abweicht. Damit werden wir auch streunende Pfade implementieren - Abkürzungen oder Geheimgänge. Damit Sie vielleicht vom dritten zum vierten eingekreisten Bereich gelangen, haben Sie den Hauptweg und einen geheimen Durchgang, der mit stärkeren Feinden gefüllt ist, aber schneller ist und höhere Belohnungen bietet.

Hier haben wir eine Sackgasse erreicht. Wir prüfen einige Optionen, haben aber keine wirklichen Fortschritte erzielt. Welchen Ansatz könnten wir verwenden, um diese Art von Pfad zu generieren? Wir sind nicht an Programmiersprachen gebunden, da wir bisher mit Java, C # und C ++ experimentiert haben. Ebenso haben wir keine aktuellen Abhängigkeiten von bestimmten Spiel-Engines.

user2444503
quelle
11
Ich würde hinzufügen, dass es nicht klar ist, was das Endergebnis ist, das Sie suchen. Die angezeigte 'Karte' ist eine Ansicht einer Region von oben nach unten. Sie entwickeln einen 2D- Side- Scroller. Wie hängen die 2 zusammen?
Vaillancourt
Ich habe die "beste" Formulierung aus Ihrer Frage entfernt, da sie nicht wirklich hilfreich ist. Ich habe auch Ihre drei vorgeschlagenen Ansätze entfernt, die alle potenziell gültige Antworten sind. Es ist im Allgemeinen besser , wenn Sie nicht mögliche Lösungen in Frage als Vergleich vorgesehen Lösungen umfassen in der Regel nicht eine Abfrage , die wir hier beim Thema betrachten (aber die Frage , wie das Problem zu lösen abwesend ist eine vorhandene Lösung Vorspannung in der Regel). Ich habe auch einige der Kommentar-Chatter aufgeräumt, die meiner Meinung nach durch die Änderungen vermieden werden.
1
Diese Linie sieht fast genauso aus wie das, was ich bekommen habe, als ich mit einer geraden Linie angefangen und ihr Perlin- (oder Simplex-) Rauschen hinzugefügt habe (mehrere Oktaven). Könnte ein Gebiet sein, das es zu erkunden gilt (ich habe eine dynamische zeitlich variierende Beleuchtung erstellt)
Richard Tingle

Antworten:

15

Bedarf

  1. Sie möchten mehrere Pfade von A nach B.
  2. Sie möchten im Rasterbereich arbeiten, vermutlich ist dies der Kachelbereich für Ihren Side-Scroller.
  3. Sie möchten nicht, dass sich Pfade kreuzen, da dies den Spielfortschritt beeinträchtigt.
  4. Sie möchten, dass die Wege einigermaßen organisch aussehen.

Voronoi-Diagramme

Voronoi-Diagramme sind raumfüllende, planare Diagramme:

Geben Sie hier die Bildbeschreibung ein

Eine schöne Sache an ihnen ist, wie Sie sie verwenden können, um organische Pfade zu erstellen. Wenn Sie eine gerade Linie von Mitte zu Mitte ziehen, erhalten Sie einen ziemlich unvorhersehbaren (sprich: nicht ortholinearen) Pfad.

So erstellen Sie ein Voronoi-Diagramm zur Verwendung mit einem kachelbasierten System

Erstellen Sie eine Karte mit einer angemessenen Größe, z. B. 128 x 128. Generieren Sie nzufällige Gitterkoordinaten (x, y) in der Karte und füllen Sie jede mit einer eindeutigen ID / Farbe. Erstellen Sie eine Liste für diese Farbe und fügen Sie diese Startzelle hinzu. Tun Sie dies für jede Farbe.

Jetzt schweben diese einzigartigen Farbpunkte in einer Leere, aber Sie müssen ganze Farbinseln um sie herum erstellen, wobei das Endergebnis folgendermaßen aussieht:

Geben Sie hier die Bildbeschreibung ein

Dazu müssen wir sehen, welche Farbe jede Zelle in der Karte besitzt (Zelle = Pixel im obigen Bild). Wir durchlaufen jede Zelle in der Karte und prüfen, welcher unserer nStartfarbpunkte ihr am nächsten liegt (über Pythonagoras). Diese Zelle wird in die Liste aufgenommen, die dieser eindeutigen ID / Farbe zugeordnet ist ... im Folgenden als Inseln- AKA-Voronoi-Zellen bezeichnet (im obigen Diagramm Gruppen von Pixeln mit derselben Farbe).

Sie sollten jetzt ein quantisiertes Voronoi-Diagramm haben. Der nächste Schritt besteht darin, die Nachbarschaft jeder Insel zu anderen Inseln zu analysieren. Richten Sie eine einfache Knoten- und Kantenstruktur ein, damit Sie ein Diagramm speichern können (Knoten ist nur die ID, die Liste für diese ID und eine leere Liste von Kanten; Kante ist nur der Start- und Endknoten). Erstellen Sie für jede eindeutig identifizierte Insel einen Knoten und fügen Sie Kanten hinzu, um ihn mit jeder angrenzenden Insel zu verknüpfen.

Sobald Sie das vollständige Diagramm (Diagramm) erstellt haben, gelangen Sie zum unterhaltsamen Teil. Verwenden Sie das Diagramm, um Inselketten zu finden. Wenn Sie dafür sorgen, dass alle Zellen auf jeder Insel in der Kette dieselbe ID haben, können Sie eine davon herausarbeiten deine Wege. Angenommen, eine Insel mit allen Zellen mit der ID 503 befindet sich neben einer Insel mit der ID 657. Sie können alle 503 Zellen durch eine ID mit der ID 657 ersetzen und so eine größere Insel mit benachbarten 657 erstellen.

Zum Beispiel - Rot ist Pfad 1, Blau ist Pfad 2, Magenta ist beides:

Geben Sie hier die Bildbeschreibung ein

Sie können alle vorhandenen Diagrammalgorithmen (einschließlich A *) verwenden, um die Pfade von Anfang bis Ende zu generieren. Ein mäandrierender Weg ist ein Fall, bei dem nicht immer der optimale Schritt zur Zielinsel verwendet wird.

Schließlich ist es trivial, die Inseln zu verkleinern, wenn Sie schmalere Pfade wünschen, oder eine größere Karte mit viel mehr Inseln zu verwenden, um eine feinere Auflösung zu erhalten.

Ein optionaler letzter Schritt zur Pfadfindung

Entweder können Sie das übergeordnete Diagramm verwenden, das Sie in Verbindung mit den zugrunde liegenden Zellen / Kacheln erstellt haben, um Laufzeit A * auszuführen, oder Sie können für eine bessere Bewegung Hill Climbing auf den zugrunde liegenden Zellen / Kacheln durchführen:

In der Mitte (oder einer beliebigen) Koordinate Ihrer Zielinsel können Sie eine Einflusszelle platzieren. Dieser Einfluss kann "Geruch" wie bei der kollaborativen Diffusion auspumpen . Dieser Duft wird sich auf dem ganzen Weg zurück zur Startinsel ausbreiten und dabei immer schwächer werden. Für eine Entität am Anfang klettern wir einfach von einer Zelle mit niedrigerem Duft zu einer Zelle mit höherem Duft, um Sie jedes Mal näher an das Ziel zu bringen - so wie ein Hund arbeitet. Da jeder Pfad ungefähr linear ist, können Sie die Verwendung von A * zur Laufzeit vermeiden. Sie können dies auch mit dem Diagramm der Inseln tun, dies ist jedoch etwas komplexer, da Sie Ihre Objekte wahrscheinlich auf Kachelebene navigieren möchten. Der erste Weg ist vielleicht besser. In beiden Fällen können Sie mit geringen Verarbeitungskosten zum Ziel navigieren.

Ingenieur
quelle
Ich habe einen Kartengenerator mit Voronoi und Perlin Noise in Java erstellt. Vielleicht kann er für Sie als Ausgangspunkt nützlich sein: github.com/dragondgold/Map-Generator
Andres