impluse (Impuls)1
Um die Grundlagen der Engine Pi Physics zu testen, bauen wir eine einfache Kettenreaktion: Ein Ball wird gegen eine Reihe von Dominos geworfen.
Bevor wir die Physik einschalten, bauen wir das Spielfeld mit allen Objekten auf:
public class ImpulseDemo extends Scene
implements FrameUpdateListener, MouseClickListener
{
private Rectangle ground;
private Rectangle wall;
private Circle ball;
private Rectangle angle;
public ImpulseDemo()
{
setupBasicObjects();
makeDominoes();
}
private void setupBasicObjects()
{
// Boden auf dem die Dominosteine stehen
ground = new Rectangle(200, 2);
ground.center(0, -5);
ground.color("white");
add(ground);
// Der Ball, der die Dominosteine umwerfen soll.
ball = new Circle(0.5);
ball.color("red");
ball.position(-10, -2);
add(ball);
// Eine senkrechte Wand links der Simulation
wall = new Rectangle(1, 40);
wall.position(-14, -4);
}
private void makeDominoes()
{
for (int i = 0; i < 20; i++)
{
Rectangle domino = new Rectangle(0.4, 3);
domino.position(i * 3 * 0.4, -4);
domino.makeDynamic();
domino.color("blue");
add(domino);
}
}
}
Dieser Code baut ein einfaches Spielfeld auf: Ein roter Ball, ein paar Dominosteine, und ein weißer Boden mit Wand.

Das Spielbrett ist aufgebaut, allerdings passiert noch nichts interessantes. Zeit für Physik!
Wir erwarten verschiedenes Verhalten von den physikalischen Objekten. Dies drückt sich in verschiedenen BodyTypes aus:
- Der Ball und die Dominos sollen sich verhalten wie normale physische Objekte:
Der Ball prallt an den Dominos ab und die Steine fallen um. Diese
Actorshaben einen dynamischen Körper. - Aber der Boden und die Wand sollen nicht wie die Dominos umfallen. Egal mit
wie viel Kraft ich den Ball gegen die Wand werfe, sie wird niemals nachgeben.
Diese
Actorshaben einen statischen Körper.
Mit der Methode Actor.setBodyType(BodyType) wird das grundlegende Verhalten
eines Actors bestimmt. Zusätzlich wird mit Scene.setGracity(Vector) eine
Schwerkraft gesetzt, die auf den Ball und die Dominos wirkt.
Jetzt wirkt Schwerkraft auf die dynamischen Objekte und der statische Boden
hält den Fall
In einer setupPhysics()-Methode werden die Body Types für die Actors gesetzt und
die Schwerkraft (standardmäßige 9,81 m/s^2, gerade nach unten) aktiviert:
Zusätzlich werden die Dominos in makeDominoes() mit domino.makeDynamic();
eingerichtet.

Jetzt wirkt Schwerkraft auf die dynamischen Objekte und der statische Boden hält den Fall
Dynamische und statische Körper sind die essentiellsten Body Types in der Engine, allerdings nicht die einzigen. Du findest einen Umriss aller Body Types in der Dokumentation von BodyType und eine vergleichende Übersicht in der dedizierten Wikiseite Den Ball Werfen Mit einem Methodenaufruf fliegt der Ball
Zeit, die Dominos umzuschmeißen! Die Methode
applyImpulse(Vector) erlaubt, den Ball physikalisch korrekt zu
'werfen'.
Mit der Zeile ball.applyImpulse(new Vector(15, 12)); kannst der erste
Ballwurf getestet werden.

Mit einem Methodenaufruf fliegt der Ball
Um hieraus eine Spielmechanik zu bauen, soll der Spieler Richtung und Stärke des Wurfes mit der Maus kontrollieren können: Per Mausklick wird der Ball in Richtung des Mauscursors katapultiert. Das Angle-Objekt hilft dem Spieler
Hierzu wird ein weiteres Rechteck angle eingeführt, das die Richtung des Impulses markiert:

Visualisierung des Wurfwinkels
Wir wollen, dass das Rechteck stets Ball und Maus verbindet. Die einfachste
Methode hierzu ist, in jedem Frame das Rechteck erneut an die Maus anzupassen.
Dafür implementiert die Dominoes-Klasse das Interface FrameUpdateListener und
berechnet frameweise anhand der aktuellen Mausposition die korrekte Länge und
den korrekten Winkel, um die visuelle Hilfe richtig zu positionieren:
Zuletzt muss der Ballwurf bei Mausklick umgesetzt werden. Hierzu wird noch das
Interface MouseClickListener implementiert:
Der komplette Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | |
-
Der Abschnitt stammt aus dem Engine-Alpha-Wiki: https://engine-alpha.org/wiki/v4.x/Physics ↩