Lenkverhalten verstehen Führungskraft folgt

Zusätzlich zu der Fähigkeit, einem Pfad zu folgen, muss ein Charakter (oder eine Gruppe von ihnen) auch in der Lage sein, einem bestimmten Charakter (wie einem Squad Leader) zu folgen. Dies kann mit dem erreicht werden Führer folgt Verhalten, das ich in diesem Tutorial erklären werde.

Hinweis: Obwohl dieses Tutorial mit AS3 und Flash geschrieben wurde, sollten Sie in der Lage sein, in fast jeder Spieleentwicklungsumgebung dieselben Techniken und Konzepte anzuwenden. Sie müssen ein grundlegendes Verständnis von mathematischen Vektoren haben.


Einführung

Das Verhalten des Anführers folgt aus anderen Lenkkräften, die alle so angeordnet sind, dass eine Gruppe von Charakteren einem bestimmten Charakter (dem Anführer) folgt. Ein naiver Ansatz würde Suchen oder Verfolgen verwenden, um ein Folgemuster zu erstellen, aber das Ergebnis ist nicht gut genug.

Im Suchverhalten wird ein Charakter auf ein Ziel gedrängt und nimmt schließlich denselben Ort wie dieses Ziel ein. Das Verfolgungsverhalten dagegen drängt einen Charakter zu einem anderen Charakter, der darauf abzielt, ihn (basierend auf Vorhersagen) einzufangen, anstatt ihm nur zu folgen.

Beim Führungsverhalten des Führers besteht das Ziel darin, dem Führer nahe genug zu bleiben etwas dahinter. Der Charakter sollte sich auch in der Ferne schneller zum Anführer bewegen, sollte sich jedoch verlangsamen, wenn der Abstand klein ist. Dies alles kann durch die Kombination von drei Lenkverhalten erreicht werden:

  • Ankommen: Bewegen Sie sich in Richtung des Führers und verlangsamen Sie allmählich, bis die Bewegung beendet wird.
  • Ausweichen: Wenn der Charakter dem Anführer im Weg steht, sollte er sich schnell entfernen.
  • Trennung: Vermeiden Sie Gedränge, wenn mehrere Zeichen hinter dem Anführer stehen.

In den nächsten Abschnitten wird erläutert, wie die einzelnen Verhaltensweisen kombiniert werden, um ein Muster für die Führungslinien zu erstellen.


Die richtige Stelle zum Folgen finden

Ein Charakter sollte versuchen, während des folgenden Prozesses etwas hinter dem Anführer zu bleiben, wie eine Armee, die hinter ihrem Kommandanten bleibt. Der folgende Punkt (benannt hinter) kann leicht anhand der Geschwindigkeit des Ziels berechnet werden, da es auch die Zeichenrichtung darstellt. Überprüfen Sie den Pseudo-Code:

tv = leader.velocity * -1; tv = normalize (tv) * LEADER_BEHIND_DIST; hinter = führer.position + tv;

Wenn der Geschwindigkeitsvektor mit multipliziert wird -1, das Ergebnis ist das invers des Geschwindigkeitsvektors. Der resultierende Vektor (genannt Fernseher) kann dann normalisiert, entsprechend skaliert und zur aktuellen Position des Charakters hinzugefügt werden.

Hier ist eine visuelle Darstellung des Prozesses:

Vektoroperationen bei der Suche nach der richtigen Stelle zum Folgen.

Desto größer LEADER_BEHIND_DIST ist, je größer der Abstand zwischen dem Führer und dem hinteren Punkt ist. Da die Zeichen diesem Punkt folgen, werden die Zeichen umso weiter vom Anführer entfernt bleiben, je weiter sie vom Anführer entfernt sind.


Folgen und Ankommen

Der nächste Schritt besteht darin, dass ein Charakter dem Anführer folgt hinter Punkt. Wie alle anderen Verhaltensweisen wird der nachfolgende Prozess von einer Kraft geleitet, die vom erzeugt wird followLeader () Methode:

private Funktion followLeader (Anführer: Boid): Vector3D var tv: Vector3D = leader.velocity.clone (); var force: Vector3D = new Vector3D (); // Berechne den hinteren Punkt tv.scaleBy (-1); tv.normalize (); tv.scaleBy (LEADER_BEHIND_DIST); behind = leader.position.clone (). add (tv); // Erzeugt eine Kraft, die am hinteren Punkt ankommt force = force.add (come (behind)); Rückkehr Kraft; 

Die Methode berechnet die hinter Punkt und erzeugt eine Kraft, um an diesem Punkt anzukommen. Das followLeader Kraft kann dann wie alle anderen Verhaltensweisen zur Lenkkraft des Charakters hinzugefügt werden:

lenkung = nichts (); // der Nullvektor, was "Zero-Force-Magnitude" bedeutet Lenkung = Lenkung + followLeader (); Lenkung = verkürzt (Lenkung, max_force) Lenkung = Lenkung / Massengeschwindigkeit = verkürzt (Geschwindigkeit + Lenkung, max_speed) Position = Position + Geschwindigkeit

Das Ergebnis dieser Implementierung ist eine Gruppe von Charakteren, die in der Lage sind, den Anführer zu erreichen hinter Punkt:

Charaktere folgen dem Anführer. Bewegen Sie den Mauszeiger, um den Anführer zu führen. Klicken Sie, um Kräfte anzuzeigen.

Crowding vermeiden

Wenn sich Charaktere sehr nahe beieinander befinden, während sie dem Anführer folgen, kann das Ergebnis unnatürlich erscheinen. Da alle Charaktere von ähnlichen Kräften beeinflusst werden, neigen sie dazu, sich ähnlich zu bewegen und einen "Fleck" zu bilden. Dieses Muster kann mithilfe von Separation behoben werden, einer der Regeln, die das Flockverhalten bestimmen.

Die Trennkraft verhindert, dass eine Gruppe von Charakteren überfüllt wird, so dass sie einen bestimmten Abstand voneinander halten. Die Trennkraft kann wie folgt berechnet werden:

private Funktionstrennung (): Vector3D var force: Vector3D = new Vector3D (); var neighbourCount: int = 0; für (var i: int = 0; i < Game.instance.boids.length; i++)  var b :Boid = Game.instance.boids[i]; if (b != this && distance(b, this) <= SEPARATION_RADIUS)  force.x += b.position.x - this.position.x; force.y += b.position.y - this.position.y; neighborCount++;   if (neighborCount != 0)  force.x /= neighborCount; force.y /= neighborCount; force.scaleBy( -1);  force.normalize(); force.scaleBy(MAX_SEPARATION); return force; 

Die Trennkraft kann dann zu der hinzugefügt werden followLeader zwingen, so dass es die Charaktere voneinander wegdrücken kann zur selben Zeit dass sie versuchen, beim Führer anzukommen:

private Funktion followLeader (Anführer: Boid): Vector3D var tv: Vector3D = leader.velocity.clone (); var force: Vector3D = new Vector3D (); // Berechne den hinteren Punkt tv.scaleBy (-1); tv.normalize (); tv.scaleBy (LEADER_BEHIND_DIST); behind = leader.position.clone (). add (tv); // Erzeugt eine Kraft, die am hinteren Punkt ankommt force = force.add (come (behind)); // Trennkraft hinzufügen Kraft = Kraft.add (Trennung ()); Rückkehr Kraft; 

Das Ergebnis ist ein viel natürlicheres Muster:

Zeichen, die dem Anführer folgen, werden getrennt verwendet Bewegen Sie den Mauszeiger, um den Anführer zu führen. Klicken Sie, um Kräfte anzuzeigen.

Aus dem Weg bleiben

Wenn der Anführer plötzlich die aktuelle Richtung ändert, besteht die Möglichkeit, dass die Charaktere dem Anführer im Weg stehen. Da die Charaktere dem Anführer folgen, macht es keinen Sinn, dass sie vor dem Anführer bleiben.

Wenn ein Charakter den Anführer behindert, sollte er sich sofort entfernen, um die Route zu löschen. Dies kann durch das Ausweichverhalten erreicht werden:

Dem Weg des Anführers ausweichen

Um zu überprüfen, ob sich ein Charakter im Anblick des Anführers befindet, verwenden wir ein ähnliches Konzept wie wir Hindernisse im Kollisionsvermeidungsverhalten erkennen: Auf der Grundlage der aktuellen Geschwindigkeit und Richtung des Anführers projizieren wir einen Punkt davor (genannt) voraus); wenn der Abstand zwischen dem Anführer voraus Punkt und der Charakter ist kleiner als 30, Zum Beispiel ist der Charakter dann in Sichtweite des Anführers und sollte sich bewegen.

Das voraus Punkt wird genau wie der berechnet hinter Punkt, mit dem Unterschied, dass der Geschwindigkeitsvektor nicht invertiert ist:

tv = leader.velocity; tv = normalize (tv) * LEADER_BEHIND_DIST; voraus = Anführer.Position + TV;

Das followLeader () Die Methode muss aktualisiert werden, um zu überprüfen, ob der Charakter in Sichtweite des Anführers ist. Wenn das passiert, die Variable Macht (die folgende Kraft darstellt) wird durch die Rückkehr von hinzugefügt Ausweichen (Anführer), was eine Kraft zurückgibt, um den Standort des Anführers zu umgehen:

private Funktion followLeader (Anführer: Boid): Vector3D var tv: Vector3D = leader.velocity.clone (); var force: Vector3D = new Vector3D (); // Berechne den Vorauspunkt tv.normalize (); tv.scaleBy (LEADER_BEHIND_DIST); ahead = leader.position.clone (). add (tv); // Berechne den hinteren Punkt tv.scaleBy (-1); behind = leader.position.clone (). add (tv); // Wenn sich der Charakter im Anblick des Anführers befindet, fügen Sie eine Kraft hinzu //, um die Route sofort zu umgehen. if (isOnLeaderSight (Führer, voraus)) force = force.add (Ausweichen (Führer));  // Erzeugt eine Kraft zum Erreichen des hinteren Punkts force = force.add (come (behind, 50)); // 50 ist der Ankunftsradius // Trennkraft hinzufügen Kraft = Kraft.add (Trennung ()); Rückkehr Kraft;  private Funktion isOnLeaderSight (Anführer: Boid, AnführerAhead: Vector3D): Boolean return distance (AnführerAhead, this) <= LEADER_SIGHT_RADIUS || distance(leader.position, this) <= LEADER_SIGHT_RADIUS;  private function distance(a :Object, b :Object) :Number  return Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); 

Jeder Charakter wird sofort aus seiner aktuellen Position ausweichen, wenn er sich in der Sicht des Anführers befindet:

Charaktere, die dem Anführer folgen, verwenden die Trennung und vermeiden die Sicht des Anführers. Bewegen Sie den Mauszeiger, um den Anführer zu führen. Klicken Sie, um Kräfte anzuzeigen.
Spitze: Die Führungskraft folgt einer Kombination mehrerer Kräfte. Wenn ein Charakter durch die nachfolgende Kraft beeinflusst wird, wird er tatsächlich gleichzeitig durch das Eintreffen, die Trennung und die Ausweichkraft beeinflusst.

Demo

Nachfolgend sehen Sie eine Demo, die das Verhalten des Führers zeigt. Der blaue Soldat (der Anführer) wird am Mauszeiger ankommen, während die grünen Soldaten dem Anführer folgen.

Wenn der Spieler irgendwo auf den Bildschirm klickt, werden alle Soldaten dem Mauszeiger zugewandt und schießen. Die Monster werden alle paar Sekunden an zufälligen Orten eintreffen.

Bewegen Sie den Mauszeiger, um den Anführer zu führen (die Soldaten folgen). Klicke, um die Monster zu erschießen.
  • Sprites: Top / Down Shoot 'Em Up Spritesheet von takomogames
  • Hintergrund: Alien Breed (esque) Top-Down Tilesheet von SpicyPixel

Fazit

Das Verhalten des Anführers erlaubt es einer Gruppe von Charakteren, einem bestimmten Ziel zu folgen und etwas hinterher zu bleiben. Die Charaktere entziehen sich auch ihrer aktuellen Position, wenn sie dem Anführer schließlich in die Quere kommen.

Es ist wichtig zu beachten, dass das folgende Verhalten des Führers ein ist Kombination von mehreren anderen Verhaltensweisen wie Ankommen, Ausweichen und Trennung. Es zeigt, dass einfaches Verhalten kombiniert werden kann, um äußerst komplexe Bewegungsmuster zu erstellen.

Danke fürs Lesen! Ich hoffe, Sie können die zuvor erläuterten Verhaltensweisen kombinieren, um Ihr eigenes komplexes Verhalten zu erstellen!