Ich habe dieses Spiel im "Breakeout-Stil".
Ich habe eine Kanone in der Mitte, Blöcke um die Kanone und Pads um die Blöcke. So sieht das Spiel aus:
Ich habe es geschafft, die Kollision pro Pixel zu erhalten, und mein Ball " reflektiert " den Kontakt mit den Blöcken mit der folgenden Mathematik:
Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;
Dabei ist die blaue Linie die Kugelrichtung und die schwarze Linie (Basislinie) die Blockoberfläche.
Die Richtung ist ein Winkel im Bogenmaß (der natürlich in Grad umgerechnet werden kann).
Der Ball wird bewegt von:
// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;
So weit, ist es gut.
Mein Problem kommt jetzt mit den Pads (die 3 dunklen und großen Blöcke um die kleinen farbigen Blöcke).
Während sie sich drehen, ändert sich der Oberflächenwinkel.
Darüber hinaus sollte der Ball auch die Seiten treffen. Wie kann ich also die Schlagrichtung und die neue Bewegungsrichtung des Balls messen?
ps : Bei Bedarf kann ich Code und einen spielbaren SWF bereitstellen.
Bearbeiten
Ok, das Problem mit den Winkeln wurde mit Vektoren gelöst , aber ich habe immer noch das Problem mit Seiten- und Rückenkollisionen.
Ich werde dafür eine andere Frage öffnen und sie hier verlinken.
quelle
Antworten:
Ich bin mir nicht sicher, ob ich Ihr Problem richtig verstanden habe, aber ich ging davon aus, dass Sie nach einer Kollision die resultierende Richtung Ihres Balls finden möchten.
Hier ist eine kurze Zeichnung auf meiner weißen Tafel, die eine mögliche Lösung dafür zeigt:
Die grünen Pfeile repräsentieren die Geschwindigkeit des Balls (als Vektor), die blauen Blöcke repräsentieren Ihre großen schwarzen Blöcke und der rote Pfeil ist der resultierende Vektor.
Im ersten Fall hat der blaue Block eine Neigung von 30 Grad. Eine Möglichkeit, das Kollisionsproblem zu beheben, besteht darin, alles wieder auf die horizontale Achse zu bringen. Was Sie tun müssen, ist alles um 30 Grad zu drehen (die Neigung des Blocks) (Sie können dafür Matrizen verwenden).
Dann überprüfen Sie , woher die Kollision kam . Wenn die Kollision horizontal war, kehren Sie die x-Komponente der Geschwindigkeit um. Wenn es vertikal war (wie in diesem Fall), die y-Komponente (
ball.Velocity.Y = -ball.Velocity.Y
). Dadurch wirkt der Ball auch korrekt, wenn er auf Ecken trifft (beide Komponenten werden umgekehrt). Danach müssen Sie nur noch zu drehen zurück in die reale Situation (die nicht auf der Zeichnung).Im zweiten Fall ist es dasselbe, außer dass die Geschwindigkeit des Balls nicht senkrecht zum Block ist. Sie drehen sich um 70 Grad, prüfen, woher die Kollision stammt, und kehren die entsprechenden Komponenten um. Danach kehren Sie zu Ihrer realen Situation zurück.
Hinweis: Mir ist aufgefallen, dass Sie anstelle eines Vektors einen Winkel verwenden, um die Richtung darzustellen. Sie können einfach einen Vektor für diese Berechnungen erstellen oder dieselbe allgemeine Idee beibehalten, aber mit Winkeln arbeiten.
Dies ist sicherlich nicht der beste Weg und ich bin sicher, dass Sie es einfach auf irgendeine Weise berechnen können, aber ich denke, es ist eine mögliche Lösung für Ihr Problem.
quelle
-block inclination angle
, um eine angemessene Kollisionsreaktion zu erhalten. Blöd mich.Direction
(als Vektor) beibehalten und die Position des Balls folgendermaßen aktualisieren :ball.Position += ball.Direction * ball.Speed;
.