Bedarf
- Sie möchten mehrere Pfade von A nach B.
- Sie möchten im Rasterbereich arbeiten, vermutlich ist dies der Kachelbereich für Ihren Side-Scroller.
- Sie möchten nicht, dass sich Pfade kreuzen, da dies den Spielfortschritt beeinträchtigt.
- Sie möchten, dass die Wege einigermaßen organisch aussehen.
Voronoi-Diagramme
Voronoi-Diagramme sind raumfüllende, planare Diagramme:
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 n
zufä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:
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 n
Startfarbpunkte 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:
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.