Zielen auf bewegte Gegner
Inhaltsverzeichnis
Zielen auf unbewegte Gegner
Hier ist der erwartete Kollisionspunkt die aktuelle Position des Gegners. In 3D benötigen wir um unseren Schuss in die Richtung des Gegners abzufeuern, einen Vektor in Richtung des Gegners mit Länge 1. Diesen können wir anschließend mit der Geschwindigkeit des Schusses und der Zeitdifferenz multiplizieren um den Schuss zu bewegen.
Richtung:=normalize(OrtDesGegners-EigenerOrt)
In 2D können wir auch mit diesem Vektor arbeiten. Oft will man jedoch auch den Winkel unter dem man den Schuss abfeuern muss. Also benötigen wir eine Funktion die aus der (x,y)-Position des Gegners, den Winkel zum Gegner errechnet. Dafür ist die Funktion arctan2 aus der unit math geeignet. Da diese den Fall y=0 jedoch nicht korrekt handhabt, habe ich darauf aufbauend eine eigene Funktion dafür geschrieben.
uses math; function WinkelZu(const x,y:real):real; begin ToDo: Add code here end;
AngleToEnemy:=WinkelZu(OrtDesGegners.x-EigenerOrt.x,OrtDesGegners.y-EigenerOrt.y)
Zielen auf bewegte Gegner
Ein bewegter Gegner bewegt sich jedoch in der Zeit in der der Schuss zu ihm unterwegs ist weiter. Das müssen wir natürlich beim Zielen berücksichtigen.
Zielen auf unbewegte Gegner
Hier ist der erwartete Kollisionspunkt die aktuelle Position des Gegners. In 3D benötigen wir um unseren Schuss in die Richtung des Gegners abzufeuern, einen Vektor in Richtung des Gegners mit Länge 1. Diesen können wir anschließend mit der Geschwindigkeit des Schusses und der Zeitdifferenz multiplizieren um den Schuss zu bewegen.
Richtung:=normalize(OrtDesGegners-EigenerOrt)
In 2D können wir auch mit diesem Vektor arbeiten. Oft will man jedoch auch den Winkel unter dem man den Schuss abfeuern muss. Also benötigen wir eine Funktion die aus der (x,y)-Position des Gegners, den Winkel zum Gegner errechnet. Dafür ist die Funktion arctan2 aus der unit math geeignet. Da diese den Fall y=0 jedoch nicht korrekt handhabt, habe ich darauf aufbauend eine eigene Funktion dafür geschrieben.
uses math; function WinkelZu(const x,y:real):real; begin ToDo: Add code here end;
AngleToEnemy:=WinkelZu(OrtDesGegners.x-EigenerOrt.x,OrtDesGegners.y-EigenerOrt.y)
Zielen auf bewegte Gegner
Ein bewegter Gegner bewegt sich jedoch in der Zeit in der der Schuss zu ihm unterwegs ist weiter. Das müssen wir natürlich beim Zielen berücksichtigen.
Verwendete Größen und Annahmen
Als erstes nehmen wir an, dass unsere Einheit im Ursprung liegen, also EigenerOrt=0. Dies ist keine Einschränkung, da wir später gegebenfalls den relativen Ort bzw. die relative Geschwindigkeit des Gegners verwenden. Nun nehmen wir noch an, dass unsere Einheit und die gegnerische Einheit punktförmig sind(bzw dass der Schuss aus dem Zentrum unserer Einheit kommt und im Zentrum der gegnerischen Einheit einschlägt).
ToDo: Tabelle erstellen OrtDesGegners : vektorielle Position des Gegners beim abfeuern des Schusses relativ zum Ursprung GeschwindigkeitDesGegners : vektorielle Geschwindigkeit des Gegners GeschwindigkeitDesSchusses : Betrag der Geschwindigkeit an, die ein von uns abgefeuerter Schuss besitzt FlugZeit : Zeit zwischen Abfeuern des Schusses und der Kollision mit dem Gegner Kollisionsort : Ort an dem Schuss und Gegner zusammentreffen. OrtDesGegners(t) : vektorielle Position des Gegners zum Zeitpunkt t
Der Ort an dem sich der Gegner zu einem Zeitpunkt t befindet errechnet sich zu: OrtDesGegners(t)=OrtDesGegners+GeschwindigkeitDesGegners*t