7 days of WordPress themes, graphics & videos - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Game Development
  2. Programming

Lenkverhalten verstehen: Bewegungsmanager

Scroll to top
Read Time: 11 mins
This post is part of a series called Understanding Steering Behaviors.
Understanding Steering Behaviors: Pursuit and Evade
Understanding Steering Behaviors: Collision Avoidance

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

Das Lenkverhalten eignet sich hervorragend, um realistische Bewegungsmuster zu erstellen, aber sie sind noch besser, wenn Sie sie leicht steuern, verwenden und kombinieren können. In diesem Tutorial werde ich die Implementierung eines Bewegungsmanagers für alle unsere zuvor besprochenen Verhaltensweisen diskutieren und behandeln.

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


Lenkungskräfte kombinieren

Wie zuvor erörtert, erzeugt jedes Lenkverhalten eine resultierende Kraft (eine sogenannte "Lenkkraft"), die zum Geschwindigkeitsvektor addiert wird. Die Richtung und Größe dieser Kraft wird den Charakter antreiben und ihn nach einem Muster bewegen (suchen, fliehen, wandern usw.). Die allgemeine Berechnung lautet:

Da die Lenkkraft ein Vektor ist, kann sie zu jedem anderen Vektor addiert werden (genauso wie die Geschwindigkeit). Die wahre "Magie" liegt jedoch in der Tatsache, dass Sie mehrere Lenkkräfte addieren können - es ist so einfach wie:

Die kombinierten Lenkkräfte ergeben einen Vektor, der all diese Kräfte repräsentiert. Im obigen Code-Schnipsel wird die resultierende Lenkkraft den Charakter dazu bringen, etwas zu suchen, während er gleichzeitig nach etwas anderem flieht.

Sehen Sie sich nachfolgend einige Beispiele von Lenkkräften an, die zu einer einzigen Lenkkraft kombiniert werden:

Steering forces combined to produce a single steering forceSteering forces combined to produce a single steering forceSteering forces combined to produce a single steering force Lenkkräfte vereint.

Komplexe Muster mühelos

Durch die Kombination der Lenkkräfte werden mühelos extrem komplexe Bewegungsmuster erzeugt. Stellen Sie sich vor, wie schwer es wäre, Code zu schreiben, um einen Charakter dazu zu bringen, etwas zu suchen, aber gleichzeitig einen bestimmten Bereich zu vermeiden, ohne Vektoren und Kräfte zu verwenden?

Das würde die Berechnung von Entfernungen, Flächen, Wegen, Grafiken und dergleichen erfordern. Wenn sich die Dinge bewegen, müssen all diese Berechnungen von Zeit zu Zeit wiederholt werden, da sich die Umgebung ständig ändert.

Beim Lenkverhalten sind alle Kräfte dynamisch. Sie sollen bei jedem Spielupdate berechnet werden, damit sie natürlich und nahtlos auf Umgebungsänderungen reagieren.

Die folgende Demo zeigt Schiffe, die den Mauszeiger suchen, aber gleichzeitig aus der Mitte des Bildschirms fliehen:

Die Schiffe suchen den Mauszeiger (grau), fliehen aber aus der Mitte des Bildschirms (orange). Klicken Sie hier, um die Kräfte anzuzeigen.

Bewegungsmanager

Um auf einfache und einfache Weise mehrere Lenkverhalten gleichzeitig nutzen zu können, bietet sich ein Bewegungsmanager an. Die Idee ist, eine "Black Box" zu erstellen, die an jede vorhandene Entität angeschlossen werden kann, um diese Verhaltensweisen ausführen zu können.

Der Manager hat einen Verweis auf die Entität, an die er angeschlossen ist (der "Host"). Der Manager stellt dem Host eine Reihe von Methoden zur Verfügung, z. B. seek() und flee(). Jedes Mal, wenn solche Verfahren aufgerufen werden, aktualisiert der Manager seine internen Eigenschaften, um einen Lenkkraftvektor zu erzeugen.

Nachdem der Manager alle Aufrufe verarbeitet hat, fügt er die resultierende Lenkkraft zum Geschwindigkeitsvektor des Hosts hinzu. Dadurch werden Größe und Richtung des Geschwindigkeitsvektors des Hosts entsprechend dem aktiven Verhalten geändert.

Die folgende Abbildung zeigt die Architektur:

Movement manager: plugin architecture. Bewegungsmanager: Plugin-Architektur.

Dinge generisch machen

Der Manager verfügt über eine Reihe von Methoden, von denen jede ein bestimmtes Verhalten repräsentiert. Jedes Verhalten muss mit unterschiedlichen externen Informationen versorgt werden, um zu funktionieren.

Das Suchverhalten benötigt beispielsweise einen Punkt im Raum, der verwendet wird, um die Lenkkraft zu diesem Ort zu berechnen; verfolgen benötigt mehrere Informationen von seinem Ziel, wie z. B. die aktuelle Position und Geschwindigkeit. Ein Punkt im Raum kann als Instanz von Point oder Vector2D ausgedrückt werden, beides ziemlich gängige Klassen in jedem Framework.

Das im Verfolgungsverhalten verwendete Ziel kann jedoch alles sein. Um den Bewegungsmanager generisch genug zu gestalten, muss er ein Ziel erhalten, das unabhängig von seinem Typ in der Lage ist, einige "Fragen" zu beantworten, wie beispielsweise "Wie hoch ist Ihre aktuelle Geschwindigkeit?". Mit einigen Prinzipien der objektorientierten Programmierung kann dies mit Schnittstellen erreicht werden.

Angenommen, die Schnittstelle IBoid beschreibt eine Entität, die vom Bewegungsmanager verarbeitet werden kann, jede Klasse im Spiel kann Steuerverhalten verwenden, solange sie IBoid implementiert. Diese Schnittstelle hat die folgende Struktur:


Struktur des Bewegungsmanagers

Da der Manager nun generisch mit allen Spielelementen interagieren kann, kann seine Grundstruktur erstellt werden. Der Manager besteht aus zwei Eigenschaften (der resultierenden Steuerungskraft und der Hostreferenz) und einer Reihe öffentlicher Methoden, eine für jedes Verhalten:

Wenn der Manager instanziiert wird, muss er eine Referenz auf den Host erhalten, an den er angeschlossen ist. Dadurch kann der Manager den Host-Geschwindigkeitsvektor entsprechend dem aktiven Verhalten ändern.

Jedes Verhalten wird durch zwei Methoden repräsentiert, eine öffentliche und eine private. Verwenden Sie die Suche als Beispiel:

Das öffentliche seek() wird aufgerufen, um den Manager anzuweisen, dieses spezifische Verhalten anzuwenden. Die Methode hat keinen Rückgabewert und ihre Parameter beziehen sich auf das Verhalten selbst, beispielsweise einen Punkt im Raum. Unter der Haube wird die private Methode doSeek() aufgerufen und ihr Rückgabewert, die berechnete Lenkkraft für dieses spezifische Verhalten, wird zur lenk-Eigenschaft des Managers hinzugefügt.

Der folgende Code demonstriert die Implementierung von seek:

Alle anderen Verhaltensmethoden werden auf sehr ähnliche Weise implementiert. Die pursuit()-Methode sieht beispielsweise folgendermaßen aus:

Mit dem Code aus vorherigen Tutorials müssen Sie diese lediglich in Form von behavior() und doBehavior() anpassen, damit sie dem Bewegungsmanager hinzugefügt werden können.


Anwenden und Aktualisieren von Lenkkräften

Jedes Mal, wenn die Methode eines Verhaltens aufgerufen wird, wird die resultierende Kraft, die es erzeugt, der steering-Eigenschaft des Managers hinzugefügt. Infolgedessen sammelt diese Eigenschaft alle Lenkkräfte an.

Wenn alle Verhaltensweisen aufgerufen wurden, muss der Manager die aktuelle Lenkkraft auf die Host-Geschwindigkeit anwenden, damit er sich gemäß den aktiven Verhaltensweisen bewegt. Es wird in der update()-Methode des Bewegungsmanagers ausgeführt:

Die obige Methode muss vom Host (oder einer anderen Spieleinheit) aufgerufen werden, nachdem alle Verhaltensweisen aufgerufen wurden, andernfalls wird der Host seinen Geschwindigkeitsvektor niemals ändern, um den aktiven Verhaltensweisen zu entsprechen.


Verwendung

Nehmen wir an, eine Klasse namens Prey soll sich mit dem Steuerverhalten bewegen, hat aber im Moment weder einen Steuercode noch den Bewegungsmanager. Seine Struktur wird wie folgt aussehen:

Mit dieser Struktur können die Klasseninstanzen mithilfe der Euler-Integration verschoben werden, genau wie in der ersten Demo des Such-Tutorials. Um den Manager verwenden zu können, benötigt es eine Eigenschaft, die auf den Bewegungsmanager verweist, und es muss die IBoid-Schnittstelle implementieren:

Die update()-Methode muss entsprechend geändert werden, damit auch der Manager aktualisiert werden kann:

Alle Verhaltensweisen können gleichzeitig verwendet werden, solange alle Methodenaufrufe vor dem update()-Aufruf des Managers erfolgen, der die akkumulierte Lenkkraft auf den Geschwindigkeitsvektor des Hosts anwendet.

Der folgende Code demonstriert eine andere Version der update()-Methode von Prey, aber dieses Mal sucht sie eine Position auf der Karte und vermeidet ein anderes Zeichen (beides gleichzeitig):


Demo

Die folgende Demo zeigt ein komplexes Bewegungsmuster, bei dem mehrere Verhaltensweisen kombiniert werden. Es gibt zwei Arten von Charakteren in der Szene: den Jäger und die Beute.

Der Jäger verfolgt eine Beute, wenn sie nahe genug kommt; es wird so lange andauern, wie die Ausdauerversorgung reicht; Wenn ihm die Ausdauer ausgeht, wird die Verfolgung unterbrochen und der Jäger wandert, bis er seine Ausdauer wiedererlangt.

Hier ist die update()-Methode von Hunter:

Die Beute wandert auf unbestimmte Zeit. Kommt der Jäger zu nahe, weicht er aus. Wenn sich der Mauszeiger in der Nähe befindet und kein Jäger in der Nähe ist, sucht die Beute den Mauszeiger.

Hier ist die update()-Methode von Prey:

Das Endergebnis (grau ist wandern, grün ist suchen, orange ist verfolgen, rot ist ausweichen):

Die Jagd. Klicken Sie auf, um Kräfte anzuzeigen.

Abschluss

Ein Bewegungsmanager ist sehr nützlich, um mehrere Lenkverhalten gleichzeitig zu steuern. Die Kombination solcher Verhaltensweisen kann sehr komplexe Bewegungsmuster erzeugen, die es einer Spieleinheit ermöglichen, eine Sache zu suchen und gleichzeitig einer anderen auszuweichen.

Ich hoffe, Ihnen hat das in diesem Tutorial besprochene und implementierte Managementsystem gefallen und Sie können es in Ihren Spielen verwenden. Danke fürs Lesen! Vergessen Sie nicht, auf dem Laufenden zu bleiben, indem Sie uns auf Twitter, Facebook oder Google+ folgen.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Game Development tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.