Ich habe Objekte in meinem Spiel, die sich um 45 Grad schneller als um 90 Grad bewegen.
Jedes Objekt hat
- Punktposition (x, y)
- Vector2D (x, y) Richtung
- Int Geschwindigkeit
Und was ich während eines Updates mache, ist, dass die neue Position wie folgt berechnet wird:
position.x += direction.x * speed
position.y += direction.y * speed
Wie korrigiere ich das? Ich möchte, dass es sich in jedem Winkel mit der gleichen Geschwindigkeit bewegt.
Antworten:
Dies kann mit dem Satz von Pythagoras erklärt werden , der die folgende Formel ist:
Wenn Sie sich nach rechts bewegen, verwenden Sie (x: 1, y: 0), was uns ergibt
Wenn Sie nach oben und rechts gehen, verwenden Sie (x: 1, y: 1), was uns ergibt
Wie Sie sehen, ist die Länge diagonal länger als die Länge auf den Kardinalachsen.
Wie bereits erwähnt, sollten Sie Ihren Richtungsvektor einfach normalisieren. Wenn Sie XNA verwenden, geschieht dies folgendermaßen:
quelle
Normalisieren Sie Ihren Richtungsvektor vor der Verwendung.
Wie von MindWorX erklärt, kann dies einfach verstanden werden. Wenn Sie sich Sorgen über Ihre Richtungsvektoren machen, die Ihnen möglicherweise Kummer bereiten, stellen Sie sicher, dass es sich um Einheitsvektoren handelt (Größe / Länge von 1).
Wenn normalisiert:
quelle
Wie berechnest du deine Richtung? Wenn 45 Grad sind
(1,1)
, ist es sicherlich schneller als 90 Grad(1,0)
.Ich schlage vor, Sie verwenden so etwas:
Um den Winkel im Bogenmaß zu erhalten, müssen Sie Ihre Gradzahl mit multiplizieren
PI / 180
oder noch besser mitMathHelper
. Z.B.quelle
Jason,
Anstatt drei Objektattribute zu haben,
es ist oft viel einfacher, richtung und geschwindigkeit zu einem geschwindigkeitsvektor zu kombinieren. Dann haben Sie nur zwei Attribute,
Position wird aktualisiert
Wenn Sie die Position des Objekts aktualisieren müssen, ist dies so einfach wie:
wo
Δt
ist dein Zeitdelta - oder Zeitunterschied - oder Zeitschritt.Aktualisieren von Position und Geschwindigkeit
Auf diese Weise ist es auch sehr einfach, mit Beschleunigungen umzugehen (z. B. durch Schwerkraft). Wenn Sie einen Beschleunigungsvektor haben, können Sie die Geschwindigkeit und die Position wie folgt zusammen aktualisieren:
(Dies ist im Grunde die Formel s = vt + ½at² aus Physik 101.)
Eine Geschwindigkeit anwenden
Wenn Sie eine bestimmte Geschwindigkeit in einer normalisierten Richtung anwenden möchten, können Sie die Geschwindigkeit folgendermaßen einstellen:
Geschwindigkeit ableiten
Und wenn Sie umgekehrt vorgehen müssen - die Geschwindigkeit und Richtung von einem gegebenen Geschwindigkeitsvektor ableiten - können Sie einfach den Satz von Pythagoras oder die
.Length()
Methode verwenden:Und sobald die Geschwindigkeit bekannt ist, kann die normalisierte Richtung berechnet werden, indem die Geschwindigkeit durch die Geschwindigkeit dividiert wird (wobei darauf zu achten ist, dass keine Division durch Null erfolgt):
quelle