Ich mache gerade ein 2D-Tower-Defense-Spiel mit einer statischen, vorgegebenen Spur, der die Feinde folgen (dh Türme können den Pfad nicht blockieren, und die Pfadfindung ist nicht das Problem, das ich zu lösen versuche).
Ich versuche herauszufinden, wie genau Einheiten dieser Spur auf reibungslose Weise folgen können. Ich habe zwei grobe Ideen, wie das geht, aber ich würde gerne einen Input bekommen, der wahrscheinlich einfacher zu implementieren ist / die Standardtechnik. Oder natürlich, wenn es einen ganz anderen Weg gibt, den ich nicht in Betracht gezogen habe, würde ich auch gerne etwas darüber lernen.
Wegpunkte: Meine erste Idee war es, den Pfad als eine Reihe fest codierter Wegpunkte zu definieren. Einheiten würden dann einen grundlegenden "Such" -Lenkalgorithmus (wie diesen ) verwenden, um sich nacheinander zu jedem Wegpunkt entlang des Pfades zu bewegen. Ich habe mich jedoch gefragt, ob es schwierig sein könnte, die Einheiten davon abzuhalten, zu stark von der Fahrspur abzuweichen, der sie folgen sollen. Ich frage mich, ob die Unfähigkeit, scharf genug abzubiegen, dazu führen kann, dass sie aus der gewünschten Spur herausgleiten. Ich nehme an, ich könnte dies verhindern, indem ich eine relativ starke Lenkkraft zulasse.
Bezier-Kurven: Die zweite Lösung, die ich in Betracht gezogen habe, besteht darin, den Pfad mit einer Bezier-Kurve zu definieren und bei jedem Zeitschritt den Punkt entlang der Kurve zu berechnen, der (dt * Geschwindigkeit) vom aktuellen Standort des Geräts entfernt ist. Ich vermute, dass diese Technik es viel einfacher machen würde, den Pfad, dem Einheiten folgen werden, genau zu definieren, aber ich weiß nicht, wie ich dies genau umsetzen soll. Irgendwelche Vorschläge?
Ich weiß auch nicht, dass dies die Antworten anderer ändern wird, aber Einheiten müssen auch in der Lage sein, sich mit einer konstanten Geschwindigkeit auf dem Weg zu bewegen. Zusätzlich programmiere ich dieses Spiel in Python mit dem Pyglet-Framework.
Wenn etwas über die Frage unklar ist, lassen Sie es mich bitte wissen.
Bearbeiten: Auch für was auch immer es wert ist, ich versuche, das Bewegungsverhalten von Feinden im Kingdom Rush zu replizieren .
Antworten:
Gestatten Sie mir, Ihnen Craig Reynolds 'berühmtes Papier über Lenkverhalten für autonome Charaktere vorzustellen . Wenn Sie es nicht gelesen haben, sollten Sie, es wird Ihnen helfen, diese Art von Problemen zu durchdenken, insbesondere werfen Sie einen Blick auf den Abschnitt über die Pfadfindung .
Die Idee von Reynolds 'Papier ist, dass Sie einfache Kräfte einsetzen können, die zusammen eine lebensechte, improvisatorische Navigation in der Umgebung erzeugen. Die Bewegungen basieren nicht auf Pfadplanung oder globalen Berechnungen, sondern verwenden lokale Informationen wie die Kräfte der Nachbarn, wodurch sie einfach zu verstehen und zu implementieren sind, aber dennoch sehr komplexe Bewegungsmuster erzeugen.
Das Schöne an diesem Ansatz ist, dass Sie mehrere Verhaltensweisen miteinander kombinieren können. So können Ihre Charaktere beispielsweise sowohl ein Pfadfindungsverhalten als auch ein Trennungsverhalten aufweisen (damit sie nicht zu stark verklumpen), das als gewichtete Summe kombiniert werden kann.
Ein weiterer Vorteil der Verwendung von Lenkverhalten besteht darin, dass eine Reihe von Open Source-Implementierungen in einer Vielzahl von Sprachen (z . B. Opensteer ) vorhanden sind.
UPDATE: Ich habe mir Kingdom Rush angesehen und ich glaube, ich habe falsch verstanden, was Sie mit "reibungslos" gemeint haben. Ich habe es als lebensechter verstanden, aber ich denke, was Sie suchen, ist eher so, als ob sich die Charaktere auf einer Bahnstrecke befinden. Bei genauerer Lektüre sehe ich auch, dass eine Ihrer Anforderungen darin besteht, dass "Einheiten in der Lage sein müssen, mit einer konstanten Geschwindigkeit auf dem Weg zu fahren". Das Lenkverhalten führt nicht zu einer konstanten Bewegungsgeschwindigkeit, sondern zu einer einfachen Wegfindung in Kombination mit Wegpunkten. (Verwenden Sie also nicht das Suchverhalten, um zum Wegpunkt zu gelangen, sondern bestimmen Sie einfach den Richtungsvektor und lassen Sie die Einheit mit voller Geschwindigkeit zu diesem Wegpunkt fahren.) Verwenden Sie mehr Wegpunkte, um die Route zu glätten.
quelle
Die Lösung in diesem Gamasutra-Artikel könnte das sein, wonach Sie suchen. Die Grundidee besteht darin, Strahlen auf einen Wegpunkt zu werfen, der zwei Schritte vor Ihrem aktuellen Wegpunkt liegt und den Strahl einen Bruchteil der Länge einer Zelle "betritt". Bei jedem "Schritt" des Strahls wird überprüft, ob das Kollisionsvolumen Ihres Spielers mit irgendetwas kollidiert an der gestuften Position des Strahls. Wenn der Strahl den Wegpunkt erreicht, der zwei Schritte voraus ist, können Sie den Zwischenwegpunkt entfernen. Sie können diesen Vorgang dann bis zum Wegpunkt "Ziel" fortsetzen. Wenn Ihr Weg also durch eine gerade Linie zum Ziel erreicht werden kann, ist eine gerade Linie zum Ziel die Route, die Ihr Charakter nehmen wird. Hier ist der Artikel: http://www.gamasutra.com/view/feature/131505/toward_more_realistic_pathfinding.
Es enthält auch großartige Dinge über den Wenderadius und ein natürlicheres Wendeverhalten und so ...
quelle