2016-07-23 4 views
0

Ich habe ein 2D-Side-Shooter-Ding, dass ich ein paar frische Augen brauche. Ich arbeite gerade am Zielen, und es funktioniert teilweise: Die Mündungsgeschwindigkeit ist bekannt, die Schwerkraft ist bekannt, und x, y Abstand zum Ziel ist auch bekannt. Mit verschiedenen Quellen sowohl hier auf SE und wikipedia, ich habe für die Berechnung des Startvektor für Projektilgeschwindigkeit mit dem folgende Verfahren kommen:Umschreiben, so dass Math.atan() unabhängig von der Orientierung funktioniert

public Vector2 calculateAim(Vector2 pos, Unit target) { 
    // Check if previous calculation can be recycled 
    if (target.equals(lastTarget)) 
     return lastAim.cpy(); 
    lastTarget = target; 

    double v = RifleBullet.projectileSpeed; // Muzzle velocity 
    double g = Settings.gravity.y;   // Gravity, positive value 
    double x = offset.x;     // x distance to target. Negative if towards left 
    double y = offset.y;     // y distance to target. Negative if lower 

    double theta = Math.atan(((v * v) - Math.sqrt((v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v)))))/(g * x)); 

    Vector2 aim = new Vector2(-(float)Math.cos(theta), (float)Math.sin(theta)); 
    aim.nor(); 
    aim.scl((float)RifleBullet.projectileSpeed); 
    lastAim = aim.cpy(); 
    return aim; 
} 

Die oben teilweise funktioniert: Der rechte Kerl richtig zielen wird. Der links stehende Typ feuert jedoch konsequent in die falsche Richtung. Es scheint, dass die Y-Komponente korrekt ist, aber die X-Komponente ist einfach umgekehrt. Wenn ich hinzufügen, diese Theta nach Berechnung:

if (side.contains("left")) 
    angleInRadians += Math.PI; 

... sie beide Feuer richtig, aber es ist nicht lebensfähig auf lange Sicht, da es mehr Einheiten auf dem Schlachtfeld sein, und es ist verpflichtet, Probleme zu verursachen, wenn ich bis zu diesem Punkt.

Ich glaube, die Quelle des Problems könnte die Math.atan() Funktion sein, da ich keine Überprüfungen habe, um zu sehen, wie das hypothetische Dreieck in der Trigonometrieberechnung orientiert ist.

Wie sollte ich meine Methode so verfeinern, dass sie richtig funktioniert, unabhängig davon, wer links/rechts/oben/unten ist?

+4

Lesen Sie auf atan2. – Tenfour04

Antwort

3

Was Tenfour04 gesagt hat, ist sehr hilfreich. Sie werden wahrscheinlich Math.atan2(y,x) statt Math.atan(y/x)

verwenden möchten Beachten Sie, dass statt die Division selbst, geben Sie die y und x als separate Argumente. Das ist so, atan2 kennt den Unterschied zwischen Sachen wie 5/2 und -5/-2. Zum normalen atan sehen sie beide wie 2.5

+0

Arbeitete wie ein Charme, und danke für die Erklärung warum! – Jarmund

+0

Froh, geholfen zu haben! – Davis

Verwandte Themen