EA 4.x Tutorial: Physics
Dies ist ein Tutorial für die Engine Alpha 4.x. Diese funktioniert anders als die EDU-Version. Du findest eine Übersicht über alle Tutorials hier.
Inhaltsverzeichnis
Inhalt
In diesem Tutorial:
- Manipulierst du die (simulierten) physikalischen Eigenschaften von verschiedenen Actors in der Engine.
- Lernst
Physik in der Engine
Seit Version 4.0 nutzt Engine Alpha eine Java-Version von Box2D. Diese mächtige und effiziente Physics-Engine ist in der Engine leicht zu bedienen und ermöglicht es, mit wenig Aufwand mechanische Phänomene in Deine Spiele zu bringen: von Platforming und Billiard bis zu Hängebrücken und Autos.
Die Physics Engine basiert auf den Prinzipien der Klassischen Mechanik. Ein Grundverständnis hierüber ist nötig: Begriffe wie Masse, Dichte, Impuls und Kraft sollten dir zumindest grob geläufig sein, um diese auf deine Spielobjekte anzuwenden.
Beispiel 1: Dominos
Um die Grundlagen der Engine Alpha Physics zu testen, bauen wir eine einfache Kettenreaktion: Ein Ball wird gegen eine Reihe von Dominos geworfen.
Setup ohne Physics
Bevor wir die Physik einschalten, bauen wir das Spielfeld mit allen Objekten auf:
package eatutorials.physics;
import ea.FrameUpdateListener;
import ea.Game;
import ea.Scene;
import ea.Vector;
import ea.actor.BodyType;
import ea.actor.Circle;
import ea.actor.Rectangle;
import ea.event.MouseButton;
import ea.event.MouseClickListener;
import java.awt.Color;
public class Dominoes extends Scene {
private Rectangle ground;
private Rectangle wall;
private Circle ball;
private Rectangle angle;
public Dominoes() {
setupBasicObjects();
makeDominoes(20, 1, 8);
getCamera().setPostion(10, 6);
getCamera().setZoom(15f);
}
private void setupBasicObjects() {
ground = new Rectangle(200, 2);
ground.setCenter(0, -1);
ground.setColor(Color.WHITE);
add(ground);
ball = new Circle(1);
ball.setColor(Color.RED);
ball.setPosition(-10, 1);
add(ball);
wall = new Rectangle(1, 40);
wall.setPosition(-15, 0);
wall.setColor(Color.WHITE);
add(wall);
angle = new Rectangle(1, 0.5f);
angle.setColor(Color.gray);
add(angle);
}
private void makeDominoes(int numX, float beamWidth, float beamHeight) {
for(int i=0; i<numX; i++) {
Rectangle beam = new Rectangle(beamWidth, beamHeight);
beam.setPosition(i*2*(beamWidth), 0);
beam.setColor(Color.BLUE);
add(beam);
}
}
}