# Schussflugbahn berechnen



## mantax (6. Dez 2008)

Hallo,

ich programmiere gerade mein erstes Spiel. Es soll ein 2D-Shoot'em-up, eine Mischung aus SuperMario und Soldat werden. Laufen, Springen, Kollisionen usw klappt schon alles.  

Nun möchte ich aber die Möglichkeit geben zu schießen. Dazu hat man ein Fadenkreuz, dass man per Maus bewegt, während die Spielfigur mit den Pfeiltasten navigiert wird. Folglich soll der Schuss von der Spielfigur aus in Richtung Fadenkreuz fliegen. 

Mein Ansatz war eine lineare Funktion:
Die Steigung m wurde durch die Koordinaten des Spielers und des Fadenkreuzes berechnet (y2-y1/x2-x1) und mit jedem Durchlauf der Hauptschleife wurde der Schuss auf der X-Achse um 1 Pixel bewegt, in Y-Achse um den Wert m.

Das hat nun aber 2 Nachteile: 
1. Umso steiler der Schuss ist, desto schneller fliegt die Kugel.
2. Man kann nur in ca 4 verschiedenen "Winkeln" schießen, aufgrund der Ungenauigkeit von Int-Variablen. Auch wenn m eine float-Variable ist, scheitert es am zeichnen des Schusses, der ja als Koordinaten Int-Werte braucht.


Was ist an meiner Methode falsch oder gibt es noch bessere Alternativen? 
Vielen Dank


----------



## Schnitter (6. Dez 2008)

Du solltest dich mal mit Vektoren auseinandersetzen.(Hat's hier übrigens auch ein gutet Tut)

Dann machst du einfach einen Mausvektor(mouseX, mouseY) namens mv. Und dann brauchst du natürlich noch die Position des spieles als Vektor(px, py) namens pv.

Dann berechnest du daraus einfach den Vektor der Kugel:
kv = mv-pv.

Den normalisierst du dann und fügst ihn jeden Frame zu dem Positionsvektor der Kugel hinzu.
In dem kv hast du jetzt den x- und den y- Wert, der jeden Frame hochgezählt wird, ist deiner Methode also garnicht so unähnlich.


----------



## Marco13 (6. Dez 2008)

Es ist nicht nur nicht unähnlich sondern ... ja, der wichtigste Unterschied ist vielleicht, dass man das Vektorenewurschtel normalerweise mit float oder double-Werten macht...


----------



## mantax (12. Dez 2008)

Vielen Dank nochma für die Antworten.

Muss zugeben, dass ich zuerst gar nciht durchgestiegen bin, aber ich bin eben zufällig noch über einen anderen Thread gestolpert, den ich zuvor per Suche nicht gefunden hatte und genau mein Problem löst! 

Hier der Link


----------

