public class Physik extends Manager implements Ticker
Ein Objekt der Klasse Physik behandelt eigenstaendig verschiedene Raum-Objekte als Physik-Engine.
Grundlegend behandelt sie Trefferkollisionen eigenstaendig, also bietet es sich an, diese Eigenschaft zu nutzen, und zwar in dem Interface KollisionsReagierbar
.
Weiterhin - und dies ist eine essentielle Aufgabe fuer viele 2D-Spiele - kann diese Maschine
- An gewuenschtren Raum-Objekten Schwerkraft erzeugen
- Aktive Raum-Objekte (Aktivobjekte, zum Beispiel Spielfiguren) so beeinlfussen, dass es fuer sie nicht moeglich ist, passive Raum-Objekte (PassivObjekte, zum Beispiel Mauer, Waende, Boeden) zu schneiden.
Diese beiden Eigenschaften in Kombination erzeugen die Moeglichkeit, sehr einfach eine funktionierende Spielewelt zu programmieren, in der bereits ein funktionierendes System zum Fallen und Grenzen abstecken existiert.
Modifier and Type | Method and Description |
---|---|
void |
aktivAbmelden(Gravitator g)
Meldet einen Gravitator wieder ab - Vorausgesetzt er war auch angemeldet.
|
void |
aktivAnmelden(Gravitator g)
Meldet einen Gravitator fuer Aktiv-Objekte an.
|
void |
alleAktivenEinsetzen(Knoten k,
BoundingRechteck b)
Setzt alle Aktiv-Objekte, die eine bestimmte Flaeche uebertreten, in einen Knoten.
|
void |
alleAktivenTestenUndEinsetzen(Knoten k,
BoundingRechteck b,
Vektor v)
Setzt alle Aktiv-Objekte, die eine bestimmte Flaeche uebertreten, nicht jedoch nach der Verschiebung ein Passiv-Objekt schneiden, in einen Knoten.
|
void |
alleAktivenTestenUndEinsetzenOhne(Knoten k,
BoundingRechteck b,
Vektor v,
Passivator p)
Setzt alle Aktiv-Objekte, die eine bestimmte Flaeche uebertreten, nicht jedoch nach der Verschiebung ein Passiv-Objekt schneiden - mit einer bestimmten Ausnahme - in einen Knoten.
|
void |
anmelden(KollisionsReagierbar k,
Raum r1,
Raum r2)
Vereinfachte Form der anmelden()-Methode fuer Kollisionstests.
|
void |
anmelden(KollisionsReagierbar k,
Raum r1,
Raum r2,
int code)
Meldet ein KollisionsReagierbar-Interface bei der Physik an.
|
Vektor |
entblocken(BoundingRechteck r)
Gibt die Verschiebung zurueck, die noetig waere um das geblockte Bounding-Rechteck aus seinem Zustand des Passiv-Blockiertseins zu loesen.
|
void |
entfernen(KollisionsReagierbar k)
Sorgt dafuer, das saemtliche Kollsiionsueberwachungsauftraege eines
KollisionsReagierbar -Interfaces nicht mehr ausgefuehrt werden. |
static Physik |
getPhysik()
Realisierung eines Singleton.
|
boolean |
inPassivem(BoundingRechteck r)
Prueft, ob eine Flaeche ein Passiv-Objekt schneidet.
|
boolean |
inPassivemAusser(BoundingRechteck r,
Passivator aus)
Prueft, ob eine Flaeche ein Passiv-Objekt - bis auf eine Ausnahme schneidet.
|
static void |
neutralize()
Neutralisiert die aktuelle Physik und macht Platz fuer eine neue.
|
void |
passivAbmelden(Passivator p)
Meldet einen Passivator wieder ab - Vorausgesetzt er war auch angemeldet.
|
void |
passivAnmelden(Passivator p)
Meldet einen Passivator an.
|
void |
tick()
In diesem Tick findet ein DELTA-t der Physik statt (= 1ms).
|
abmelden, alleAbmelden, anhalten, anmelden, anmelden, fontExistiert, hatAktiveTicker, intervallSetzen, istAngemeldet, kill, starten
public static void neutralize()
Neutralisiert die aktuelle Physik und macht Platz fuer eine neue.
public static final Physik getPhysik()
Realisierung eines Singleton. Da es nur eine Physik pro Anwendung gibt, garantiert diese statische Methode, dass es nur ein Physik Objekt gibt, da keine Physik-Objekte erstellt werden koennen.
public void passivAnmelden(Passivator p)
Meldet einen Passivator an.
p
- Der Passivator, der anzumelden ist.public void passivAbmelden(Passivator p)
Meldet einen Passivator wieder ab - Vorausgesetzt er war auch angemeldet.
p
- Der abzumeldende Passivatorpublic void aktivAnmelden(Gravitator g)
Meldet einen Gravitator fuer Aktiv-Objekte an.
g
- Der anzumeldende Gravitatorpublic void aktivAbmelden(Gravitator g)
Meldet einen Gravitator wieder ab - Vorausgesetzt er war auch angemeldet.
p
- Der abzumeldende Gravitatorpublic void alleAktivenEinsetzen(Knoten k, BoundingRechteck b)
Setzt alle Aktiv-Objekte, die eine bestimmte Flaeche uebertreten, in einen Knoten.
k
- In diesen Knoten werden alle Aktiv-Objekte, die die Flaeche betreten eingefuegt.b
- Dieses BoundingRechteck beschreibt die kritische Flaeche.public void alleAktivenTestenUndEinsetzen(Knoten k, BoundingRechteck b, Vektor v)
Setzt alle Aktiv-Objekte, die eine bestimmte Flaeche uebertreten, nicht jedoch nach der Verschiebung ein Passiv-Objekt schneiden, in einen Knoten.
k
- In diesen Knoten werden alle Aktiv-Objekte, die die Flaeche betreten, nicht jedoch nach der Verschiebung problematisch waeren eingefuegt.b
- Dieses BoundingRechteck beschreibt die kritische Flaeche.v
- Die kritische Verschiebung.public void alleAktivenTestenUndEinsetzenOhne(Knoten k, BoundingRechteck b, Vektor v, Passivator p)
Setzt alle Aktiv-Objekte, die eine bestimmte Flaeche uebertreten, nicht jedoch nach der Verschiebung ein Passiv-Objekt schneiden - mit einer bestimmten Ausnahme - in einen Knoten.
k
- In diesen Knoten werden alle Aktiv-Objekte, die die Flaeche betreten, nicht jedoch nach der Verschiebung problematisch waeren eingefuegt.b
- Dieses BoundingRechteck beschreibt die kritische Flaeche.v
- Die kritische Verschiebung.p
- Die eine Ausnahme als Passivatorpublic boolean inPassivem(BoundingRechteck r)
Prueft, ob eine Flaeche ein Passiv-Objekt schneidet.
r
- Die Flaeche der Ueberprueftung, als BoundingRechtecktrue
, wenn diese Flaeche ein Passivobjekt schneidet, sonst false
.public Vektor entblocken(BoundingRechteck r)
Gibt die Verschiebung zurueck, die noetig waere um das geblockte Bounding-Rechteck aus seinem Zustand des Passiv-Blockiertseins zu loesen.
r
- Das zu entblockende BoundingRechteckpublic boolean inPassivemAusser(BoundingRechteck r, Passivator aus)
Prueft, ob eine Flaeche ein Passiv-Objekt - bis auf eine Ausnahme schneidet.
r
- Die Flaeche der Ueberprueftung, als BoundingRechteckaus
- Die eine Ausnahme, die bei den Kollisionstests nicht beruecksichtigt wird.true
, wenn diese Flaeche ein Passivobjekt - ausser der einen Ausnahme - schneidet, sonst false
.public void tick()
In diesem Tick findet ein DELTA-t der Physik statt (= 1ms).
public void anmelden(KollisionsReagierbar k, Raum r1, Raum r2, int code)
Meldet ein KollisionsReagierbar-Interface bei der Physik an. Zusammen mit den 2 auf Kollision zu ueberwachenden Raum-Objekten sowie dem Code, der bei dem Aufruf beim Treffer zwischen den beiden mitgegeben werden soll.
Die kollision(int code)
-Methode des anzumeldenden KollisionsReagierbar
-Interfaces wird ab sofort immer dann aufgerufen wenn:
1. beide Raum-Objekte schneiden
und 2. beide Raum-Objekte sichtbar sind
Diese Methode wird solange immer wieder aufgerufen, wie die Kollision besteht! Wird also in der kollision(int code)
-Methode nicht dafuer gesorgt, dass sich die Objekte nicht mehr schneiden, so wird diese Methode wieder und wieder aufgerufen!
ACHTUNG
Es sollten niemals 2 Knoten oder Geometrie (oder ein Knoten und ein Geometrie) - Objekte gleichzeitig angemeldet werden. Ist dies der Fall, ist der Kollisionstest nicht so genau, wie er seien koennte.
k
- Das KollisionsReagierbar-Objekt, das benachrichtigt wird, wenn beide Objekte kollidierenr1
- Der erste Raum-Teil. Kollidieren beide, so wird das KollisionsReagierbar-Objekt benachrichtigtr2
- Der zweite Raum-Teil. Kollidieren beide, so wird das KollisionsReagierbar-Objekt benachrichtigtcode
- Der Code, der dem KollisionsReagierbar
-Objekt als Parameter in seiner reagieren()-Methode mitgegeben werden soll.public void anmelden(KollisionsReagierbar k, Raum r1, Raum r2)
Vereinfachte Form der anmelden()-Methode fuer Kollisionstests.
Hierbei wird immer der Code code = 0 bei der reagieren()
-Methode mitgegeben, somit ist beim Aufruf dieser Methode keine Fallunterscheidung innerhalb eines FallReagierbar
-Objektes moeglich!
k
- Das KollisionsReagierbar-Objekt, das benachrichtigt wird, wenn beide Objekte kollidierenr1
- Der erste Raum-Teil. Kollidieren beide, so wird das KollisionsReagierbar-Objekt benachrichtigtr2
- Der zweite Raum-Teil. Kollidieren beide, so wird das KollisionsReagierbar-Objekt benachrichtigtanmelden(KollisionsReagierbar, Raum, Raum, int)
public void entfernen(KollisionsReagierbar k)
Sorgt dafuer, das saemtliche Kollsiionsueberwachungsauftraege eines KollisionsReagierbar
-Interfaces nicht mehr ausgefuehrt werden.
k
- Das Interface, an dem jede Ueberwachung von Raum-Objekten abgebrochen werden soll.