Zielen auf bewegte Gegner: Unterschied zwischen den Versionen
K (Kategorisiert) |
|||
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt) | |||
Zeile 32: | Zeile 32: | ||
Der Ort an dem sich der Gegner zu einem Zeitpunkt t befindet errechnet sich zu: | Der Ort an dem sich der Gegner zu einem Zeitpunkt t befindet errechnet sich zu: | ||
'''OrtDesGegners'''(t)='''OrtDesGegners'''+'''GeschwindigkeitDesGegners'''*t | '''OrtDesGegners'''(t)='''OrtDesGegners'''+'''GeschwindigkeitDesGegners'''*t | ||
+ | |||
+ | Hinweis, dass bei Netzwerkspielen eine Positionsvorhersage eingesetzt wird mit der man versucht kleine Übertragungshänger zu überbrücken. | ||
+ | |||
+ | [[Kategorie:Technik oder Algorithmus]] |
Aktuelle Version vom 21. März 2008, 19:59 Uhr
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
Hinweis, dass bei Netzwerkspielen eine Positionsvorhersage eingesetzt wird mit der man versucht kleine Übertragungshänger zu überbrücken.