Hier ist die relevante Logik, die ich für das Pong auf meiner Homepage verwendet habe : (Bitte spiele sie vor dem Lesen, damit du weißt, welchen Effekt ich mit dem folgenden Code erreiche.)
Wenn der Ball mit dem Paddel kollidiert, wird seine Richtung im Wesentlichen völlig ignoriert. Es erhält eine neue Richtung, je nachdem, wie weit von der Mitte des Paddels entfernt es kollidiert ist. Wenn der Ball genau in der Mitte auf das Paddel trifft, wird er genau horizontal weggeschickt. Wenn es direkt auf die Kante trifft, fliegt es in einem extremen Winkel (75 Grad) davon. Und es fährt immer mit konstanter Geschwindigkeit.
var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;
Nehmen Sie den mittleren Y-Wert des Paddels und subtrahieren Sie den Y-Schnittpunkt des Balls. Wenn das Paddel 10 Pixel hoch ist, liegt diese Zahl zwischen -5 und 5. Ich nenne dies den "relativen Schnitt", da es sich jetzt im "Paddelraum" befindet, dem Schnittpunkt des Balls relativ zur Mitte des Paddels.
var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;
Nehmen Sie den relativen Schnittpunkt und teilen Sie ihn durch die halbe Paddelhöhe. Jetzt ist unsere Zahl von -5 bis 5 eine Dezimalzahl von -1 bis 1; es ist normalisiert . Dann multiplizieren Sie es mit dem maximalen Winkel, um den der Ball springen soll. Ich habe es auf 5 * Pi / 12 Radiant (75 Grad) eingestellt.
ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);
Berechnen Sie abschließend mit Hilfe der einfachen Trigonometrie neue Kugelgeschwindigkeiten.
Dies ist möglicherweise nicht der Effekt, den Sie anstreben, oder Sie möchten möglicherweise auch eine Geschwindigkeit ermitteln, indem Sie den normalisierten relativen Schnittpunkt mit einer maximalen Geschwindigkeit multiplizieren. Dies würde den Ball schneller machen, wenn er in der Nähe der Kante eines Paddels schlägt, oder langsamer, wenn er in der Nähe der Mitte schlägt.
Möglicherweise möchte ich einen Code darüber, wie ein Vektor aussehen würde oder wie ich die Variable des Vektors speichern könnte, den die Bälle haben (Geschwindigkeit und Richtung).
Ein Vektor enthält implizit sowohl Geschwindigkeit als auch Richtung. Ich speichere meinen Vektor als "vx" und "vy"; das heißt, die Geschwindigkeit in der x-Richtung und die Geschwindigkeit in der y-Richtung. Wenn Sie keinen Einführungskurs in Physik belegt haben, scheint Ihnen das etwas fremd zu sein.
Der Grund, warum ich das tue, ist, dass es die erforderlichen Einzelbildberechnungen reduziert. Jedes Bild, das Sie gerade machen, x += vx * time;
und y += vy * time;
wo die Zeit die Zeit seit dem letzten Bild ist, in Millisekunden (daher sind die Geschwindigkeiten in Pixel pro Millisekunde).
In Bezug auf die Implementierung der Fähigkeit, den Ball zu krümmen:
Zunächst müssen Sie die Geschwindigkeit des Paddels zum Zeitpunkt des Ballschlags kennen. Dies bedeutet, dass Sie den Verlauf des Paddels nachverfolgen müssen, damit Sie eine oder mehrere frühere Positionen des Paddels kennen und mit der aktuellen Position vergleichen können, um festzustellen, ob es sich bewegt hat. (Änderung der Position / Änderung der Zeit = Geschwindigkeit; Sie benötigen also 2 oder mehr Positionen und die Zeiten dieser Positionen)
Sie müssen jetzt auch eine Winkelgeschwindigkeit des Balls verfolgen , die praktisch die Kurve darstellt, entlang der er sich bewegt , aber dem tatsächlichen Spin des Balls entspricht. Ähnlich wie Sie den Sprungwinkel aus der relativen Position des Balls bei Kollision mit dem Paddel interpolieren würden, müssten Sie auch diese Winkelgeschwindigkeit (oder Drehung) aus der Geschwindigkeit des Paddels bei Kollision interpolieren. Anstatt die Drehung einfach so einzustellen, wie Sie es mit dem Abprallwinkel tun, möchten Sie möglicherweise die vorhandene Drehung des Balls addieren oder subtrahieren, da dies in Spielen gut funktioniert (der Spieler kann feststellen, dass sich der Ball dreht, und veranlassen, dass er sich dreht noch wilder, oder kontern Sie die Drehung in einem Versuch, es geradeaus zu bewegen).
Beachten Sie jedoch, dass dies zwar der gängigste und wahrscheinlich einfachste Weg ist, die tatsächliche Physik eines Sprunges jedoch nicht nur von der Geschwindigkeit des Objekts abhängt, auf das er auftrifft. Einem Objekt ohne Winkelgeschwindigkeit (kein Spin), das unter einem Winkel auf eine Oberfläche trifft, wird ein Spin verliehen. Dies könnte zu einer besseren Spielmechanik führen, daher möchten Sie vielleicht einen Blick darauf werfen, aber ich bin nicht sicher, welche Physik dahinter steckt, also werde ich nicht versuchen, es zu erklären.