chrixko Geschrieben 12. November 2008 Teilen Geschrieben 12. November 2008 Hallo Fachinformatiker Zu meinem Problem ( eigentlich sind es 2 ) : Ich programmiere zurzeit das Spiel Breakball. ( oder Breakout, wie man es nennen möchte.) Problem 1 : Ich komme nicht darauf wie ich abfragen kann ob der Ball ( Rectangle ) die Steine ( Rectangles ) von oben/unten bzw. rechts/links trifft. Ich brauche diese Abfrage, da ich ja festlegen muss wie der Ball reflektiert. Problem 2 : Ich kann einen Winkel für die Flugbahn des Balls angeben. Nur wie kann ich den Winkel, je nachem wo der Ball den Wagen unten trifft, generieren, so dass dieser sich sinnvoll verändert ? Ich hoffe ihr wisst eine Lösung Schonmal Danke im vorraus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Argbeil Geschrieben 12. November 2008 Teilen Geschrieben 12. November 2008 Wie hast du denn angefangen? Hasst du ein Array in dem das Spielfeld hinterlegt ist, bzw. ist der Ball ein Objekt? Der muss ja denn einen Bewegungsvektor sowie eine Position haben. Bei einer Kollision kannst du doch aus dem Vektor und der Position einen neuen Vektor errechnen. Zu dem zweiten Problem: Da hilft Pythagoras, das ist ja einfach nur ein Dreicek. Der Einfallswinkel zum Panel unten ist = dem Ausganswinkel, nur in entgegengesetzter Richtung. Wenn du dir eine Vertikale Linie von dem Panel ausgehend denkst, und der Ball kommt z.B. auf einem 18 Grad Winkel links von der Linie auf das Panel musst du in mit 18° rechts wieder zurücksenden. Zudem sollte eine Bewegung des Pedals eine Auswirkung haben, also den Winkel verstärken oder verflachen (je nach Bewegungsrichtung) Einfach mal aufmalen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
chrixko Geschrieben 12. November 2008 Autor Teilen Geschrieben 12. November 2008 (bearbeitet) Schonmal danke für die Antwort Also für den Ball habe ich eine Steigung ( ich weis nich genau was mit Vektor gemeint ist ) um den Ball zu reflektieren drehe ich entweder die Bewegung auf der X- oder Y-Achse um : z.B. For Each b As TBall In Balls If b.Position.X <= 0 Then b.DirectionX = -b.DirectionX End If Zum 2. Problem: Was mache ich den, wenn der Ball von Rechts kommt und auf die Linke hälfte des Panels trifft ? EDIT: Wenns hilft die Steine sind in einem Array hinterlegte Rectangles. Bearbeitet 12. November 2008 von chrixko Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Argbeil Geschrieben 12. November 2008 Teilen Geschrieben 12. November 2008 (bearbeitet) Mit den beiden Werten kommst du vermutlich nicht so weit wenn du Schrägen hast, zudem ist es nicht präzise genug. Dein Ball braucht eine radiale Bewegungsrichtung ( 0 bis 360 Grad) aus der du die neue Position berechnest, bei Kollisionen musst du jeweils 180 Grad abziehen. Beispiel: Der Ball fliegt mit genau 0 Grad nach oben, bei einer Kollision ziehst du von dem Kreismaß 180 Grad ab und hast die neue Bewegungsrichtung, ( 0 - 180 ) = -180, das Vorzeichen fällt weg, neue Richtung ist also 180, was eine geraden Bewegung nach unten entspricht. Fliegt der Ball von links oben nach rechts unten ( 135° ) ist nach einer Kollision der die neue Richtung ( 135 - 180 ) = -45, also 45 Grad, was rechts oben entspricht. Das ist erst mal ganz trivial und so funktionieren die meisten Breakout Klone. Wenn das funktioniert muss man den Winkel durch die Bewegung des Schlägers ändern können, je nachdem ob sich der Schläger nach links oder rechts bewegt muss die Zahl die du abziehst größer oder kleiner werden, das kann man auch noch durch die Geschwindigkeit des Balls und des Schlägers varrrieren, musste ein bisschen mit rumspielen. Das reicht völlig aus für ein normales Breakout. Wenn du jetzt schräge Flächen hast, kommst du nicht drumrum beim Aufprall mit einem gedachten Dreieck den Aufprallwinkel an der jeweiligen Fläche zu berechnen, von dem Winkel werden dann wieder die berühmten 180 abgezogen. Bearbeitet 12. November 2008 von Argbeil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
chrixko Geschrieben 14. November 2008 Autor Teilen Geschrieben 14. November 2008 Ok, danke erstmal. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. November 2008 Teilen Geschrieben 14. November 2008 Fliegt der Ball von links oben nach rechts unten ( 135° ) ist nach einer Kollision der die neue Richtung ( 135 - 180 ) = -45, also 45 Grad, was rechts oben entspricht.Das kommt nicht hin. Die 180°-Regel passt nur, wenn die Fläche, mit der kollidiert wird, genau senkrecht zur aktuellen Bewegungsrichtung steht. Man muss bei der Kollision des Balls mit einem Stein prüfen, ob der Ball gegen eine senkrechte oder eine waagerechte Kante des Steins gestoßen ist. In Abhängigkeit davon wechselt entweder die X- oder die Y-Komponente der Bewegungsrichtung ihr Vorzeichen. Man kann noch Sonderfälle für Kollisionen mit den Ecken einbauen, aber es sollte zuerst auch ohne gehen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
chrixko Geschrieben 14. November 2008 Autor Teilen Geschrieben 14. November 2008 Man muss bei der Kollision des Balls mit einem Stein prüfen, ob der Ball gegen eine senkrechte oder eine waagerechte Kante des Steins gestoßen ist. In Abhängigkeit davon wechselt entweder die X- oder die Y-Komponente der Bewegungsrichtung ihr Vorzeichen. Genau das ist ja mein Problem. Ich weis nicht wie ich das überprüfen soll. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. November 2008 Teilen Geschrieben 14. November 2008 Genau das ist ja mein Problem. Ich weis nicht wie ich das überprüfen soll. Nach jeder Richtungsänderung des Balls kannst du ermitteln, mit welcher Kante welches Steins er als nächstes kollidieren wird, indem du den Schnittpunkt deiner Ball-Bewegungsgeraden mit den Steinkanten ermittelst. Du brauchst dabei immer nur zwei der vier Steinkanten zu prüfen. Wenn der Ball nach rechts und unten fliegt, kann er nur mit der linken oder oberen Kante eines Steins kollidieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
chrixko Geschrieben 14. November 2008 Autor Teilen Geschrieben 14. November 2008 Also soll ich am besten nach jeder Kollision eine Variable setzen die die Richtung angibt ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. November 2008 Teilen Geschrieben 14. November 2008 Also soll ich am besten nach jeder Kollision eine Variable setzen die die Richtung angibt ? Das machst du doch ohnehin schon, mit DirectionX und (mutmaßlich) DirectionY. Du kannst aber zu diesem Zeitpunk bereits ausrechnen, wo die nächste Kollision erfolgen wird. D.h. wenn die Steine sich nicht bewegen, und es nur einen Ball gibt. Wenn du nicht vorhersehen kannst, ob ein Stein später noch da ist, wo er jetzt ist, musst du die Kollisionsberechnung in jedem Frame machen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
chrixko Geschrieben 14. November 2008 Autor Teilen Geschrieben 14. November 2008 Ok, die Steine bewegen sich nicht, also werde ich das besagte Problem nicht haben. Ich werds erstmal ausprobieren, Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.