Ich benutze die Wegfindung in meinem Spiel, um einen Mob zu einem anderen Spieler zu führen (um ihn zu verfolgen). Dies funktioniert, um sie über den Player zu bringen, aber ich möchte, dass sie kurz vor ihrem Ziel anhalten (die Auswahl des vorletzten Knotens funktioniert also einwandfrei).
Wenn jedoch mehrere Mobs das Handy verfolgen, stapeln sie sich manchmal "übereinander". Was ist der beste Weg, um dies zu vermeiden? Ich möchte die Mobs nicht als undurchsichtig und blockiert behandeln (weil sie es nicht sind, können Sie durch sie gehen), aber ich möchte, dass die Mobs einen Sinn für Struktur haben.
Beispiel:
Stellen Sie sich vor, jede Schlange führte sich zu mir und sollte "Setsuna" umgeben. Beachten Sie, wie beide Schlangen beschlossen haben, mich zu stechen? Dies ist keine strenge Anforderung. sogar leicht versetzt zu sein ist okay. Aber sie sollten Setsuna "umgeben".
quelle
Antworten:
Geben Sie Ihren Agenten eine schwache "elektrostatische Aufladung", damit sie sich gegenseitig abstoßen, wie es das Coulombsche Gesetz vorsieht .
Der Einfachheit halber sollte angenommen werden, dass sich Mobs mit gleicher Stärke gegenseitig wegdrücken sollten, und es sollte ausreichen, eine Kraft zwischen jedem Paar von Mobs mit einer Größe aufzubringen
some_constant / distance^2
, wobeisome_constant
eine konfigurierbare Abstoßungsstärke unddistance
der Abstand zwischen ihnen ist.Die Abstoßungsstärken fallen dann mit dem Quadrat der Entfernung ab.
Nature of Code hat ein großartiges Beispiel (mit einer LiveDemo) hier . Es sieht aus wie das:
Jedes Element gegeneinander abzugleichen ist eine
O(n^2)
Operation mit quadratischer Zeit ( ). Wenn Sie wirklich viele Agenten haben, möchten Sie möglicherweise die Kraftberechnungen mit einer Barnes-Hut-Näherung optimieren , die auf log-linear (O(n log n)
) reduziert wird, aber einen Quadtree erfordert .quelle
Mein Ansatz ähnelt dem von @ Anko, basiert jedoch auf der Arbeit von Millington und Funge von Artificial Intelligence for Games .
So würde ein Trennungsverhalten aussehen, aber Sie müssen berücksichtigen, dass diese Geschwindigkeit mit der Geschwindigkeit des Agenten in seiner Aktualisierungsfunktion berechnet werden sollte.
quelle