Wo hört mein Charakter auf?

12

Vor vielen Jahren habe ich eine KI für ein billiges Pseudo-3D-Spiel geschrieben. Es gab eine Berechnung, bei der ich nie wirklich herausgefunden habe, wo der Feind enden würde, wenn er jetzt anhalten würde. Beispielsweise:

  • Der Feind befindet sich derzeit bei X = 540.0.
  • Der Feind bewegt sich mit 10 Pixel pro Frame nach rechts.
  • Wenn der Feind anhalten möchte, sinkt seine Geschwindigkeit um 1 Pixel pro Bild, bis er Null erreicht.

Gibt es eine einfache Formel, die mir die Position gibt, an der der Feind endet, wenn er vollständig gestoppt ist? Am Ende habe ich den Offset vorberechnet und hartcodiert, der für meine Anforderungen geeignet war, aber für Feinde mit unterschiedlichen Geschwindigkeiten separat berechnet werden musste.

Kaivosukeltaja
quelle

Antworten:

7

Ich stimme im Allgemeinen der Antwort von John zu. Ich werde eine leicht modifizierte Formel anbieten (die seinem Wert ein zusätzliches V / 2 hinzufügt):

D = V / A * (V + A) / 2 

Mit V = 10und A = 1erhält man D = 55. Dies ist genau das Ergebnis von

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

Das ist die Bild für Bild Bewegung des Feindes.

Hier erfahren Sie, wie Sie zu diesem Schritt gelangen.

  1. V : Aktuelle Geschwindigkeit = 10 Pixel / Frame, A : Aktuelle Beschleunigung = 1 Pixel / Frame ^ 2
  2. T : Zeit zum Anhalten = V / A = 10 Bilder.
  3. Zurückgelegte Strecke in 10 Bildern = Bild1 + Bild2 + Bild3 + ... = V + (VA) + (V-2 * A) + ...
  4. Dies ist gleich T * V - A / 2 * T * (T-1), was die obige Gleichung vereinfacht.
Jimmy
quelle
+1 Ich kann keine logischen Fehler in Ihrer Lösung erkennen und kann mich auch nicht erinnern, wie ich auf meine Lösung gestoßen bin. Also muss mein Gesichtsausdruck falsch sein und ich habe es wahrscheinlich nicht bemerkt, aufgrund des kleinen Unterschieds und des Mangels an detaillierten Tests? Wäre mein Ausdruck korrekt, wenn ich einfach die Hälfte der Geschwindigkeit addieren würde?
John McDonald
Ich habe meine Frage mit power calc beantwortet. Wenn Sie meinen Ausdruck + (v / 2) nehmen, ist Ihr Ausdruck für jedes gegebene v und a immer gleich.
John McDonald
Vielen Dank an @John und Sie, das hätte mir früher viel Mühe erspart! Ich akzeptiere diese Antwort, da sie einfacher und effizienter ist, aber auch Johns Antwort wird sehr geschätzt. Prost!
Kaivosukeltaja
6

Ich hatte genau das gleiche Problem, als ich an meinem Spiel arbeitete, und es dauerte ewig, bis ich die Mathematik richtig verstanden hatte (bleh). Hier ist es also:

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

Umgeschrieben in reguläre Mathematik:

(Acceleration / 2) * (linearVelocity / Acceleration)^2

Bei einer Beschleunigung von 1 in Ihrem Fall und einer linearen Geschwindigkeit von 10:

(1 / 2) * (10 / 1)^2
= 50 units to stop

BEARBEITEN

Das Ergebnis und die Erklärung von Jimmy sind beide richtig. Meine Formel erfordert, dass Sie auch die Hälfte der Geschwindigkeit hinzufügen.

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

oder

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55
John McDonald
quelle
2
Nur zur Veranschaulichung, Math.Pow () ist hier eine schreckliche, schreckliche Idee. Es mag sein , dass der Exponent '2.0' ein Sonderfall ist, wenn er intelligent genug ist, aber auf jede Art und Weise, wie Sie ihn aufteilen, sollte es ein großer Gewinn sein, diesen Ausdruck als '0.5 * linearVelocity * linearVelocity / Acceleration' umzuschreiben.
Steven Stadnicki
4

Berechnungen über Geschwindigkeitsänderungen sind der gesamte Punkt der Berechnung. Ich habe es eine Weile nicht mehr getan, deshalb kann ich mich nicht mehr an die Spitze meines Kopfes erinnern, aber ich denke, Ihre Situation nimmt einfach das Integral von -1 (dh die Verzögerung) an.

jhocking
quelle
0

Ist das nicht konstante Beschleunigungsbewegung?

X = Xi + V*t + (1/2) * a * (t^2)

Wobei:
X: Letzte Position
Xi: Ausgangsposition
V: Geschwindigkeit
t: Zeit
a: Beschleunigung

Der einzige schwierige Teil hier ist, wie man "t" bestimmt, da wir mit einer Beschleunigung von -1 langsamer werden, dann können wir t = V / a berechnen, dann ist t 10.

also
Xi: 540
V: 10
t: 10
a: -1

Alles anziehen:

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

Die Formel ergibt sich aus der Integration der Beschleunigung: Hier überprüfen

tesla
quelle