Skid
Erfahrenes Mitglied
Hallo,
ich bin wiedermal zu einen Punkt gekommen, wo ich einfach nicht weiterkomme.
Das Problem was ich derzeit habe ist eine genaue Kollision bspw. eines Balles.
Mir ist durchaus bewusst, dass das schon oft besprochen worden ist, jedoch fand ich bisher immer nur Kollisionsabfragen in Bezug auf Sprites oder ähnlichen, was sich in der Pixelumgebung (1Pixel bis 2x2Pixel) schwer realisieren lässt.
Mein Problem:
Ich habe einen Ball (1Pixel) der eine bestimmte Geschwindigkeit besitzt (bspw. ballSpeed = 4).
Die Geschwindigkeit bzw. die Bewegung rechne ich auf die jeweiligen Achsen um die abhängig vom derzeitigen Ballwinkel (ballAngle = 180) sind (XAchsenBewegung = ballSpeed * (cos (ballAngle * PI / 180)), YAchsenBewegung = ballSpeed * (sin (ballAngle * PI / 180)) ).
Funktioniert soweit recht gut, auch wenn ich hier das Problem habe, dass das mir etwas zu grob ist, wenn ich es in int konvertiere, aber da lasse ich mir noch was genaues einfallen, dass soll auch nicht Thema dieses Threads werden.
Angenommen, der Ball kollidiert jetzt mit der Wand, dann kann ich das wie folgt abfragen:
Jedoch fängt es hier schon an ungenau zu werden, d.h. der Ball verschwindet teilweise kurz, weil er kurzzeitig in den Minusbereich kommen kann (bspw. -1 bei der Abfrage nach windowWidth).
Hier müsste ich die Differenz ausrechnen, anschließend den neuen Winkel (s.o.) und später die Differenz (von Abstand Wand zu Ball) einfach zur neuen Richtung hinzuaddieren.
Im nächsten Zyklus, würde die XAchsen- und YAchsenBewegung neuberechnet werden, okay, soweit so gut.
Problemetisch jedoch wird es für mich, wenn es um eine Kollision geht, bei einen Objekt, was der Spiele steuert und da hört es bei mir auf, weil die Algorithmen die mir einfallen einfach zu kompliziert sind und zu fehleranfällig.
Hier bräuchte ich jetzt Hilfe.
Wenn ich z.b. mein PingPong-Spiel nehme, dann müsste ich für jede XAchsenBewegung und YAchsenBewegung auf eine Kollision prüfen mit den Koordinaten des Spielers.
Da aber der Austrittswinkel abhängig von der Spielerbewegung ist und die XAchsenBewegung nicht 0 werden darf, komme ich irgendwie auf keinen wirklich guten Nenner.
Desweiteren kann der Ball das Spielerobjekt einfach überspringen, da er bspw. vom SpielerObjekt noch 2Pixel entfernt ist, sich jedoch 4Pixel schnell bewegt.
Entweder klappt die Kollision, der Ball wird allerdings kurzzeitig hinter dem Spielobjekt angezeigt, oder die Kollision wird erkannt und nichts geht mehr.
Vielleicht kann mit mir jemand das evtl. Schritt für Schritt durchgehen (Pseudocode), vielleicht ist die Lösung auch total simpel, da ich allgemein der Meinung bin, dass ich mich da irgendwie zu stark festgefressen habe.
Vielen Dank und liebe Grüße,
SkiD.
ich bin wiedermal zu einen Punkt gekommen, wo ich einfach nicht weiterkomme.
Das Problem was ich derzeit habe ist eine genaue Kollision bspw. eines Balles.
Mir ist durchaus bewusst, dass das schon oft besprochen worden ist, jedoch fand ich bisher immer nur Kollisionsabfragen in Bezug auf Sprites oder ähnlichen, was sich in der Pixelumgebung (1Pixel bis 2x2Pixel) schwer realisieren lässt.
Mein Problem:
Ich habe einen Ball (1Pixel) der eine bestimmte Geschwindigkeit besitzt (bspw. ballSpeed = 4).
Die Geschwindigkeit bzw. die Bewegung rechne ich auf die jeweiligen Achsen um die abhängig vom derzeitigen Ballwinkel (ballAngle = 180) sind (XAchsenBewegung = ballSpeed * (cos (ballAngle * PI / 180)), YAchsenBewegung = ballSpeed * (sin (ballAngle * PI / 180)) ).
Code:
yCourse
^
|
|
O --------> xCourse
Funktioniert soweit recht gut, auch wenn ich hier das Problem habe, dass das mir etwas zu grob ist, wenn ich es in int konvertiere, aber da lasse ich mir noch was genaues einfallen, dass soll auch nicht Thema dieses Threads werden.
Angenommen, der Ball kollidiert jetzt mit der Wand, dann kann ich das wie folgt abfragen:
Code:
if(bX >= windowWidth || bX <= 0)
b.setAngle((bA == 0) ? 180 : (int)(180 - bA));
if(bY >= windowHeight || bY <= 0)
b.setAngle((bA == 90) ? -90 : (int)(360 - bA));
Jedoch fängt es hier schon an ungenau zu werden, d.h. der Ball verschwindet teilweise kurz, weil er kurzzeitig in den Minusbereich kommen kann (bspw. -1 bei der Abfrage nach windowWidth).
Hier müsste ich die Differenz ausrechnen, anschließend den neuen Winkel (s.o.) und später die Differenz (von Abstand Wand zu Ball) einfach zur neuen Richtung hinzuaddieren.
Im nächsten Zyklus, würde die XAchsen- und YAchsenBewegung neuberechnet werden, okay, soweit so gut.
Problemetisch jedoch wird es für mich, wenn es um eine Kollision geht, bei einen Objekt, was der Spiele steuert und da hört es bei mir auf, weil die Algorithmen die mir einfallen einfach zu kompliziert sind und zu fehleranfällig.
Hier bräuchte ich jetzt Hilfe.
Wenn ich z.b. mein PingPong-Spiel nehme, dann müsste ich für jede XAchsenBewegung und YAchsenBewegung auf eine Kollision prüfen mit den Koordinaten des Spielers.
Da aber der Austrittswinkel abhängig von der Spielerbewegung ist und die XAchsenBewegung nicht 0 werden darf, komme ich irgendwie auf keinen wirklich guten Nenner.
Desweiteren kann der Ball das Spielerobjekt einfach überspringen, da er bspw. vom SpielerObjekt noch 2Pixel entfernt ist, sich jedoch 4Pixel schnell bewegt.
Entweder klappt die Kollision, der Ball wird allerdings kurzzeitig hinter dem Spielobjekt angezeigt, oder die Kollision wird erkannt und nichts geht mehr.
Vielleicht kann mit mir jemand das evtl. Schritt für Schritt durchgehen (Pseudocode), vielleicht ist die Lösung auch total simpel, da ich allgemein der Meinung bin, dass ich mich da irgendwie zu stark festgefressen habe.
Vielen Dank und liebe Grüße,
SkiD.