Also, hier ist mein Problem:
Ich habe einen Turm an einem Schiff angebracht, der sich mit variabler Geschwindigkeit durch meine Spielwelt bewegt und in der Mitte eines anderen Schiffes schießt, das in einem möglicherweise anderen Vektor durch die Spielwelt fährt. Derzeit erhalte ich den Winkel, auf den ich mit atan2 schießen muss:
double targetAngle = Math.Atan2(ship.CurrentTarget.Position.Y - ship.Position.Y, ship.CurrentTarget.Position.X - ship.Position.X);
Dies funktioniert gut, wenn beide Schiffe stationär sind oder sich sehr langsam bewegen, aber wenn sie sich schneller bewegen, bleibt das Ziel zurück. Ein zusätzlicher lustiger Teil des Puzzles: Der Vektor der Kugel ist nicht statisch, sie beginnen bei 0 und erhöhen die Geschwindigkeit. Ihre Position wird wie folgt berechnet:
var direction = new Vector2((float)Math.Cos(currentRotation),
(float)Math.Sin(currentRotation));
if (direction.Length() > 0)
direction.Normalize();
var velocity = new Vector2(direction.X * MotionData.CurrentSpeed,
direction.Y * MotionData.CurrentSpeed) + additiveVector;
Wobei additiveVector der Vektor meines Schiffes zum Zeitpunkt des Abschusses des Projektils ist. CurrentSpeed wird jedem Frame hinzugefügt, bis eine statische Höchstgeschwindigkeit erreicht ist.
Bisher habe ich bei anderen Lösungen zur Kompensation meines Ziels auf Probleme gestoßen, dass die Formeln auf einer statischen Geschwindigkeit für das Projektil beruhen und meine nicht.