*Markus: Game-Physik: Pinball

Hallo,

ich recherchiere nun schon eine ganze Weile um herauszufinden, wie man die Game-Physik in einem Pinball-Spiel am besten anwenden kann. Dabei stieß ich u.a. auch auf dieses Beispiel, das sehr einfach gestrickt aussieht:

http://wd-testnet.world-direct.at/mozilla/dhtml/funo/pinballtest/pinball2textAlignCenter.htm#

In dem Java-Script gibt es eine Funktion, bumperCollided, die meiner Meinung nach Wesentliches enthält:

  
			var deltaX = colPosX - this.posX;  
			var deltaY = colPosY - this.posY;  
			  
			var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);  
			  
			var scaleFactor = this.radius / distance;  
			var tangentPointX = this.posX + scaleFactor * deltaX;  
			var tangentPointY = this.posY + scaleFactor * deltaY;  
			  
			objBollen.speedX += objBollen.speedX * (-1) + deltaX * 0.08;  
			objBollen.speedY +=  objBollen.speedY * (-1) + deltaY * 0.08;  

Ich schätze, dass da irgendwie die Tangente, also der Schnittpunkt ausgerechnet wird, um den "Abprall" zu berechnen, aber wirklich durchblinken tue ich da nicht. Kann sich darauf jemand etwas zusammenreimen?

Danke,
Markus

  1. Hallo,

    Was mich insbesondere wundert sind die Zeilen

                            objBollen.speedX += objBollen.speedX * (-1) + deltaX * 0.08;  
                            objBollen.speedY +=  objBollen.speedY * (-1) + deltaY * 0.08;
    

    Äquivalent dazu ist

                            objBollen.speedX = deltaX * 0.08;  
                            objBollen.speedY = deltaY * 0.08;
    

    Also wird die Kugel auf das Hindernis geschossen (wenn speedX und speedY die X bzw. Y-Koordinaten der Velocity sind)?

    *grübel*

    Viele Grüße,
      Unscheinbar

  2. Tach.

    Ich schätze, dass da irgendwie die Tangente, also der Schnittpunkt ausgerechnet wird, um den "Abprall" zu berechnen, aber wirklich durchblinken tue ich da nicht. Kann sich darauf jemand etwas zusammenreimen?

    Wenn man mal den Teil, der zwar berechnet aber nicht benutzt wird, ignoriert, steht da folgendes:

      
    function bumperCollided(objBollen) {  
    	// aktuelle Position der Kugel (Kugelmittelpunkt)  
    	var colPosX = objBollen.posX + objBollen.radius;  
    	var colPosY = objBollen.posY + objBollen.radius;  
      
    	// X- und Y-Abstand zwischen Kugel und Bumper (Mittelpunkt zu Mittelpunkt)  
    	var deltaX = colPosX - this.posX;  
    	var deltaY = colPosY - this.posY;  
      
    	// neuer Geschwindigkeitsvektor der Kugel  
    	objBollen.speedX = deltaX * 0.08;  
    	objBollen.speedY = deltaY * 0.08;  
    }  
    
    

    Wenn speedX und speedY beide positiv sind, bewegt sich die Kugel von links oben nach rechts unten (der Koordinatenursprung liegt in der linken oberen Ecke des Feldes). Stößt sie nun z. B. von oben auf einen Bumper, der rechts unter ihr liegt, werden die beiden Deltas in bumperCollided negativ. Das gibt schonmal die neue Richtung der Kugel vor, nämlich ab nach links oben. Größere Bumper führen aufgrund ihres größeren Radius auch zu größeren Beträge der Deltas. Je größer also der Bumper, desto schneller prallt die Kugel von ihm ab. Über den Gewichtungsfaktor (in diesem Beispiel 0.08) läßt sich die Stärke des Abpralls noch skalieren. Größere Werte führen zu schneller abprallenden Kugeln.

    --
    Wenn es schwingt, ist es ein Filter – Oszillatoren würden so etwas nie tun.
    1. Hallo,

      danke für die Info. Jetzt ist mir klar, was diese 0.08 bedeuten.

      Markus