Version vom 9. Juni 2023, 00:34 Uhr von Andonie (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „{{DISPLAYTITLE:EA 4.x Tutorial: Physics}} {{4.xTutorialHeader}} == Inhalt == In diesem Tutorial: * Manipulierst du die (simulierten) physikalischen Eigensc…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)


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.

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);
        }
    }
}