2D-Pfadfindung - glatte Pfade finden

10

Ich habe versucht, eine einfache Wegfindung zu implementieren, aber das Ergebnis ist weniger zufriedenstellend als das, was ich erreichen wollte. Die Sache ist, dass sich Einheiten in Spielen wie Starcraft 2 in alle Richtungen bewegen, während sich Einheiten in meinem Fall nur in höchstens 8 Richtungen bewegen (Warcraft 1-Stil), da diese 8 Richtungen direkt zu den nächsten verfügbaren Knoten führen (sie bewegen sich von einem Plättchen zum nächsten benachbarten Plättchen). . Was muss ich tun, um das Ergebnis wie in Starcraft 2 zu erzielen? Fliesengröße verkleinern?

http://i.stack.imgur.com/lr19c.jpg

Auf dem Bild sehen Sie eine horizontale Linie von Felskacheln als Hindernisse und den gefundenen Pfad als grüne Kacheln. Die rote Linie ist der Weg, den ich erreichen möchte.

Kooi Nam Ng
quelle
Ich bin ein großer Fan der Sprungpunktsuche, obwohl ich noch keine Zeit gefunden habe, sie zu implementieren. Aber die Dokumentation war interessant und hat eine gute Leistung.
2
Bist du sicher, dass das dein gewünschter Weg ist? Einheiten, die es verwenden, gehen teilweise durch Wände. Ich habe es in einem anderen Beispiel sichtbarer gemacht: i.imgur.com/eh4ZR.png Und hier ist, was Sie wahrscheinlich wirklich erreichen möchten: i.imgur.com/vFQg4.png
Markus von Broady
Sie haben Recht. Mein Weg war fehlerhaft, aber er diente eher zur Veranschaulichung. Vielen Dank, dass Sie den besseren Weg aufgezeigt haben.
Kooi Nam Ng
Sie müssen Bruchkoordinaten innerhalb einer Kachel haben, um das zu erhalten, was Sie wollen. Ohne dies würde kein möglicher Pfad funktionieren. Wenn Sie die Brüche tragen, aber nicht anzeigen, bewegt sich Ihre Einheit gerade / diagonal / gerade / diagonal.
Loren Pechtel
@LorenPechtel Sie liegen falsch, Sie können den Pfad glätten, nachdem Sie einen gefunden haben. Es ist ganz einfach, wenn Sie zwei Linien basierend auf den Abmessungen der Einheit erstellen und prüfen, ob sie sich mit Kacheln zwischen Kachel0 und KachelN schneiden, wobei Kachel1-Kachel (N-1) Kacheln sind, die Sie aus dem Pfad entfernen möchten.
Markus von Broady

Antworten:

8

Für einen guten Pfadfindungsalgorithmus wäre die Verwendung von A * wahrscheinlich eine gute Idee für ein einfaches Spiel, das keine ausgefeilte, effiziente oder effektive Pfadsuche erfordert, bei der sich die Charaktere einfach auf ein Ziel zubewegen, indem sie die Richtung von herausfinden Das Ziel sollte ausreichend sein.

Sie können aus den Scheitelpunkten ein Sichtbarkeitsdiagramm erstellen (welche anderen Punkte von jedem Punkt aus sichtbar sind) und dann A * für das Diagramm ausführen. Dies funktioniert, da der kürzeste Pfad immer im Sichtbarkeitsdiagramm liegt.

Das Verkleinern der Fliesengröße kann Ihnen helfen.

Ressourcen

Weiterführende Literatur

EDIT: Ich mag @ MarkusvonBroadys Kommentar.

"Es geht eigentlich um das Glätten von Pfaden, nicht um das Finden. Der auf dem Bild gefundene Pfad sieht in Ordnung aus."

Ressourcen

Von @MarkusvonBroady

Ich habe eine Suche durchgeführt und finde Folgendes (diese können Ihnen helfen)

Md Mahbubur Rahman
quelle
1
tolle Links, +1 von mir
lhk
2
@ MarkusvonBroady, danke für -1. Ich habe von dir gelernt Ich möchte keinen Punkt, sondern bin bereit zu lernen und den richtigen zu teilen. Ich glaube, wenn wir diskutieren, können wir den richtigen finden. :)
Md Mahbubur Rahman
@ MarkusvonBroady, würden Sie bitte mehrere Ressourcen des Pfadglättungsalgorithmus gemeinsam nutzen?
Md Mahbubur Rahman
Eigentlich denke ich, dass diese Antwort dem OP hilft. Ich glaube nicht, dass das OP nach einer tatsächlichen Glättung (Spline-Interpolation oder dergleichen) gefragt hat, sondern dass sein Algorithmus derzeit einen schrecklich nicht optimalen Pfad findet und in eine gerade Linie "geglättet" werden muss. Welches A * natürlich ohne zusätzliche Glättung für ihn gefunden hätte.
Sean Middleditch
Ich hatte A * verwendet und ich glaube, ich hatte den optimalen Weg gefunden.
Kooi Nam Ng
0

Ausgehend von einem Ende des Rohpfads path[0]können Sie beispielsweise entfernen, path[1]ob das Segment, das durch Verbinden der Punkte von path[0]und gebildet path[2]wird, KEINE Wand schneidet. Wenn Sie weiter bis zum letzten Segment gehen, erhalten Sie einen einfacheren Pfad.

Dies wird nicht nur den Pfad glätten, sondern auch einige nutzlose Punkte entfernen, wie z. B. 3 aufeinanderfolgende Segmente einer geraden Linie.

arainone
quelle