Ich mache ein 2D-Spiel. Derzeit fliegt ein Hubschrauber herum, der vom Spieler gesteuert wird. Die Steuerung erfolgt über die Pfeiltasten: AUF, LINKS und RECHTS.
Die Geschwindigkeit entlang der y-Achse ist dy
und die Geschwindigkeit entlang der x-Achse ist dx
.
Die Physik ist wie folgt:
Wenn UP nicht gedrückt wird , dy
beschleunigt es mit konstanter Beschleunigung auf unbestimmte Zeit nach unten. (Schwere). dx
bleibt in seinem aktuellen Wert.
Wenn UP gedrückt wird , dy
beschleunigt es mit konstanter Beschleunigung von dem, was es gerade ist, auf 4 (nach oben, bis es Geschwindigkeit 4 erreicht). dx
bleibt in seinem aktuellen Wert.
Wenn LINKS gedrückt wird , dx
wird mit konstanter Beschleunigung von -10 auf -4 beschleunigt .
Wenn RECHTS gedrückt wird , beschleunigt dx mit konstanter Beschleunigung von derzeit auf 4 .
(Wenn LINKS oder RECHTS gedrückt wird und UP nicht gleichzeitig gedrückt wird, wie gesagt: wird dy
immer kleiner, weil die Schwerkraft den Hubschrauber beeinflusst)
All dies führt dazu, dass der Hubschrauber häufig Bögen in der Luft folgt und nicht geraden Linien.
Dies schafft Physik, die ziemlich realistisch erscheint.
Meine Frage ist:
Der gegnerische Hubschrauber, eine KI, sollte sich mit demselben Physiksystem bewegen.
Nehmen wir an, die KI möchte von dort, wo sie sich gerade befindet, zu Punkt B gelangen.
Wenn es keine Schwerkraft und keine allmähliche Beschleunigung im Spiel gäbe, wäre es einfach. Ich würde einfach einen Vektor von der Position der KI zu Punkt B zeichnen und die KI dazu bringen, ihm zu folgen.
Da es jedoch Schwerkraft und allmähliche Beschleunigung gibt, kann sich die KI niemals (fast) geradlinig bewegen . Was wäre der beste Weg, um die KI so zeiteffizient wie möglich zu Punkt B zu bringen?
Wie kann ich die Schwerkraft berücksichtigen, wenn ich die KI auf ein bestimmtes Ziel hin bewege?
(Wenn es einfacher zu erklären ist, betrachten Sie Punkt B auf der y-Achse als auf der gleichen Ebene wie die KI und nicht diagonal dazu.)
Vielen Dank
Antworten:
tl; dr:
Gleiches gilt für y. Denken Sie daran, die Geschwindigkeit so zu begrenzen, dass sie zwischen Null und der Höchstgeschwindigkeit liegt. Wenn der Feind irgendwann eine sehr langsame Geschwindigkeit hat und versucht anzuhalten, kann er sich in die entgegengesetzte Richtung bewegen. Lassen Sie es nicht zu. Stoppen Sie ihn, wenn er langsamer wird und seine Geschwindigkeit unter 1 * Acc liegt.
Lange Version: Wenn keine Hindernisse vorhanden sind, ist die Bewegung auf der y-Achse für die Bewegung auf der x-Achse völlig irrelevant (und hat keinen Einfluss darauf). Die von Ihnen beschriebene Frage kann also in zwei separate Fragen unterteilt werden.
CS.x
&CS.y
sind unsere aktuelle Geschwindigkeit auf der x- und y-Achse.TS.x
&TS.y
Ist die Zeit, die Sie benötigen würden, um nur vertikal oder horizontal anzuhalten, unter Berücksichtigung Ihrer aktuellen Geschwindigkeit in der entsprechenden Achse.D.x
&D.y
sind der Abstand auf jeder Achse.tl; dr: Sie beschleunigen weiter (wenn möglich [sofern Sie nicht die Höchstgeschwindigkeit erreicht haben]) auf der x-Achse, bis Sie eine Stelle erreichen, an der die folgende Bedingung erfüllt ist:
Das gleiche gilt für y.
quelle
Ein Ansatz, den ich für ein ähnliches Problem verwendet habe, bestand darin, zuerst einen Vektor zum Ziel zu zeichnen und diesen dann mit der aktuellen Geschwindigkeitsrichtung zu vergleichen.
Nehmen Sie also den vorzeichenbehafteten Winkel zwischen dem Geschwindigkeitsvektor und dem Zielvektor und wenden Sie einen Schub relativ zur Größe des Vektors an.
Wenn also der Winkel a zwischen dem roten Geschwindigkeitsvektor und dem grünen Zielvektor negativ ist, wenden Sie einen positiven Schub an, andernfalls wenden Sie keinen Schub an und lassen Sie die Schwerkraft ihn aussortieren.
Beachten Sie, dass Sie die vier Quadranten behandeln müssen, in denen sich das Ziel möglicherweise anders befindet (als ob sich das Ziel in der oberen linken Ecke befunden hätte, hätte ein positiver Winkel das Anwenden von Schub erforderlich gemacht).
Stellen Sie außerdem sicher, dass der Schub relativ zur Abweichung von der Zielgeschwindigkeit angewendet wird.
Technisch gesehen berücksichtigt dies nicht die Schwerkraft, sondern gleicht den aktuellen Zustand aus und bedeutet, dass der KI-Hubschrauber möglicherweise nicht in einer geraden Linie zum Ziel fliegt, sondern ein wenig wackelt. Dies kann für Ihr Spiel funktionieren oder nicht.
quelle
Sie können einfach die Bewegung jedes X-Frames neu berechnen. Vorausgesetzt, Sie setzen nicht zu viele Frames dazwischen, aber genug, um die Leistung nicht zu beeinträchtigen, sollte die Schwerkraft eines Hubschraubers nicht stark genug sein, um wirklich zu sehen, wie sich die Flugbahn ändert. Außerdem denke ich, dass sich ein Spieler möglicherweise auf die gleiche Weise bewegen könnte, indem er sich während der Bewegung an die Schwerkraft anpasst und diese nicht geplant hat.
quelle