drawLine mit Kollisionsabfrage?

Status
Nicht offen für weitere Antworten.

KaaNo

Mitglied
Hi,

ich arbeite im Moment an einem 2D Spiel und das ganze realisiere ich mit Swing/AWT. Jedoch stecke ich gerade in einer Sackgasse und weiß einfach nicht weiter.

Dabei handelt sich mein erstes Problem mit dem Befehl drawLine(x,x,x,x). Ich möchte eine Linie mit Kollisionsabfrage zeichnen. Soll heissen, dass Start-Koordinaten und End-Koordinaten bekannt sind aber wenn sich zwischen diesen 2 Punkten etwas befindet, soll er nur bis zu diesem Hindernis die Linie malen. Um das ganze vielleicht etwas besser zu verstehen ein Bild:



Die schwarze Linie soll dabei die tatsächlich gezeichnete Linie sein und die rote soll nicht gezeichnet werden. Im Spiel könnt ihr euch das so vorstellen, dass die Start-Koordinaten der Spieler ist, welcher in einer Art Jump&Run durch den Level hüpfen kann, und die End-Koordinaten sind der Mauszeiger. Die Linie soll eine Zielhilfe für den Spieler sein, der die Aufschläge der Geschosse vorhersieht. Der Levelaufbau ist in einem Raster gespeichert, welches in ein Array geladen wird. Bei meinem Lösungsversuchen, versuche ich das ganze als Hilfe zu nehmen aber so ganz auf das gewünsche Ergebnis bin ich noch nicht gekommen. Dazu vielleicht eine Zeichnung von mir:



Das ist ein Beispiel Level mit natürlich übergroßen Feldern. Das dunkle Markiert ein Feld, wo das Zeichnen aufhören soll. Die Felder sind 50 Pixel groß. Ich habe zunächst versucht mehrere drawLine's auszuführen, unzwar immer bis zu einer Grenze. Danach wird überprüft ob sich in dem Nachbar X-Feld ein "undurchscheinbares" Feld befindet. Wenn Ja wird aufgehört drawLine's zu zeichnen. Bei einer Y-Grenze ist es parallel dazu dasselbe. Das ganze in zwei verschachtelten for-Schleifen wäre perfekt gewesen, da ich mit der Formel startX/50 - endX/50 bzw. startY/50 - endY/50 ohne Probleme herausfinden kann wieviele Felder sich bis zu den Endkoordinaten befinden und in welche Richtung diese gehen. Das Problem: Die Steigung! Sagen wir startX%50 ist 48 und startY%50 ist 1, da würde man auf den Gedanken kommen, dass die X-Grenze als erstes erreicht wird, aber wenn die Gerade 90° nach oben geht, dann ist es eben nicht so.

Ich weiß echt nicht mehr weiter. Ich habe soviele Berechnungen gemacht um auf eine Lösung zu kommen aber nichts bringt mich weiter. Vielleicht denke ich auch zu kompliziert und es gibt irgendeine Funktion in Java die mich da ohne Probleme weiterbringt, desshalb bitte ich euch um Rat.

Problem 2:

Dieses Problem hängt glaub ich eng mit dem 1. zusammen. Wenn die Figur jetzt mit der linken Maustaste einen Feuerball abfeuern soll (Image), dann soll dieser in die Richtung fliegen, wohin gezeigt wird, desshalb die Zielhilfe von oben. Mir ist klar, dass ich dabei einfach die x und y Koordinaten erhöhen/verringern muss aber um wieviel damit er genau dahinfliegt, wohin gezeigt wird? Der Feuerball bekommt von mir eine Geschwindigkeit spendiert, wird an den Koordinaten vom Spieler erzeugt und soll jetzt Richtung Endwerte und noch weiter bis zu einer Kollision fliegen. Die Kollision ist nicht das Problem nur halt die Flugrichtung, da ich keine Ahnung habe wie seine Koordinaten verändert werden soll.

Danke schonmal im voraus : ]

g
 

Illuvatar

Top Contributor
@1: Ich denke, mit einer Gleichung ließe sich die Sache lösen.
Die Gleichung der Geraden wäre ja sowas:
y = (endY - startY) / (endX - startX) * (x - startX) + startY;
Je nach Menge der Felder wäre es jetzt sinnvoller, entweder die Gleichung von links nach rechts durchzugehen und jeweils zu testen, ob die Punkte in einem Feld liegen, oder die Felder von links nach rechts durchzugehen, und zu prüfen, ob die Gerade durchgeht.
 
G

Guest

Gast
Ich verstehe deine Formel nicht ganz. Was versuchst du damit zu machen? Vorallem was ist bei dir x? Du berechnest anscheinend den 1. y-Wert zu berechnen aber woher kennst du x?

g
 

Illuvatar

Top Contributor
Hmm, also ich hatte lineare Gleichungen in der 7. Klasse oder so :bae:
Wenn du in die Gleichung x (Pixelweise) einsetzt, kriegst du die y-Werte. Und dann kannst du schauen, ob irgendein x/y Paar in einem der Felder ist.
 

KaaNo

Mitglied
Hm.. das scheint ja echt zu funktionieren. Ich versteh zumindestens was du jetzt meinst. Im Prinzip brauch ich jetzt nur noch die Werte überprüfen, die an den Grenzen sind. Na das will ich gleich mal testen.

g
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben