Schussflugbahn berechnen

Status
Nicht offen für weitere Antworten.

mantax

Mitglied
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. :cool:

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

Bekanntes Mitglied
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

Top Contributor
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

Mitglied
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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben