2010-12-29 18 views
0

Ich mache Pong, und finde es wirklich schwierig, einen Algorithmus zu schreiben, der den Ball richtig von den vier Wänden abprallt (ich werde später, weil nur ein Teil des West + Ost Seiten werden Ziele sein). Im Moment möchte ich, dass der Ball um die Kiste springt.Box Kollisionserkennung und Bouncing

Das Erkennen, ob der Ball eine Wand getroffen hat, ist einfach, aber ich habe Probleme, den neuen Winkel zu berechnen.

Dies ist, was ich mit so weit habe kommen:

 if(dstY == 0) { 
      // North wall 
      if(angle < 90) { 
       newAngle = angle + 90; 
      } else { 
       newAngle = angle - 90; 
      } 
     } else if(dstX == maxWidth) { 
      // East wall 
      if(angle < 90) { 
       newAngle = angle + 270; 
      } else { 
       newAngle = angle + 90; 
      } 
     } else if(dstY == maxHeight) { 
      // South wall 
      newAngle = angle + 90; 
     } else if(dstX == 1) { 
      // West wall 
      if(angle < 270) { 
       newAngle = angle - 90; 
      } else { 
       newAngle = angle - 270; 
      } 
     } 

, die nur für etwa die Hälfte der Kollisionen arbeitet, und sieht wirklich hässlich. Ich bin mir sicher, dass dies wirklich einfach sein sollte und dass es schon oft gemacht wurde.

In meinem Code sind dstX/dstY die X/Y-Zielkoordinaten. X = 0 und y = 0 oben links.

+0

Können Sie beschreiben, wie es scheitert? Was passiert, wenn der Ball genau in einer Ecke schlägt? –

Antwort

1

Sie können auf 2 Arten auf aussehen:

Angles: Wenn Sie den Winkel der Ball einfach an kollidiert, nur 180 ausführen - Winkel den neuen Winkel zu finden.

Gradient: Wahrscheinlich einfacher. Sie müssen den Ball jeden t Millisekunden mit einem bestimmten dY und dX bewegen. Wenn Sie also auf die Wand schlagen, können Sie einfach mit invertierenden Zeichen von dY und dX spielen. Wenn Sie zum Beispiel die rechte Wand treffen, wird dX -dX, während dY seinen Kurs fortsetzt.

1

In diesem KineticModel verwendet die Methode collideWalls() zweidimensionale Vektorarithmetik, um die Simulation einer elastischen Kollision zwischen einem Partikel und einer flachen Oberfläche zu vereinfachen.

0

Ein Wort der Weisheit über die Verwendung der jbx-Gradientenmethode. Wenn der Ball in der Nähe der Ecken der Box trifft, während dx invertiert wird, kann dy den Ball über die obere Grenze legen.

-1

Dank @jbx, ich wusste, es gab einen einfacheren Weg :) Allerdings scheint das nicht für die Ost- und Westwände und die Paddel funktionieren (wenn sie an diesen Wänden sind). Dies scheint für mich auf der Ost- und Westwände obwohl zu arbeiten:

(180 - (angle + 90)) - 90. 

, die nur (180-angle) vereinfacht zu. Hoffe, dass hilft.

+0

So würde das nicht vereinfachen. – Jessy