Physik Engine - HerrSturm/EckenerProject GitHub Wiki
Konzept
Die zentrale Komponente ist die Klasse HitBox
. Sie stellt eine Rechteck dar, das mit anderen HitBox
en interagieren kann. Eine weitere Klasse CollisionManager
verwaltet diese Interaktionen.
HitBox
en werden organisiert in Schichten, durch die Layer
Klasse. Diese erhalten einen einfachen string
als Namen. Über den CollisionManager
kann kontrolliert werden, welche Layer
mit welchen interagieren können.
Nutzung
HitBox
Eine HitBox
wird wie folgt erstellt:
from HitBox import *
# ...
hitBox = HitBox(pos, size, isStatic, layer)
mitVel = HitBox(pos, size, isStatic, layer, vel)
dabei sind:
Parameter | Typ | Bedeutung |
---|---|---|
pos |
Vec2 |
Position |
size |
Vec2 |
Größe |
isStatic |
bool |
statisch? |
layer |
Layer |
Schicht |
vel |
Vec2 |
Anfangsgeschwindigkeit (optional) |
Callbacks
Um informiert zu werden, wenn etwas mit der HitBox
passiert, werden callbacks verwendet.
Ein solches callback muss installiert werden. Anschließend ruft die HitBox
die installierte Funktion auf,
wenn das entsprechende Event eintritt.
Installiert werden callbacks über Methoden der HitBox
.
onPosChanged
Das onPosChanged
-callback wird aufgerufen, wenn sich die HitBox
bewegt.
Das callback erhält als Parameter die HitBox
, die sich bewegt hat.
Es wird wie folgt installiert:
hitBox = HitBox(...)
# ...
def fn(hitBox):
# ...
# ...
hitBox.onPosChanged(fn)
Beispiel:
hitBox = HitBox(...)
def changed(hitBox):
print(hitBox.pos)
# Position des Bildes updaten
hitBox.onPosChanged(changed)
onCollide
Das onCollide
-callback wird aufgerufen, wenn die HitBox
an eine andere stößt.
Das callback erhält als Parameter die HitBox
, die kollidiert ist, und die, an die sie gestoßen ist
(in dieser Reihenfolge)
Es wird wie folgt installiert:
hitBox = HitBox(...)
# ...
def fn(hitBox, other):
# ...
# ...
hitBox.onCollide(fn)
Beispiel:
hitBox = HitBox(...)
def collided(hitBox, other):
print(other.layer.name)
# Spieler verliert ein Leben
hitBox.onCollide(collided)
CollisionManager
Der CollisionManager
muss regelmäßig geupdated werden:
CollisionManager().update(dt)
dabei ist dt
die Zeit, die seit dem letzten update
vergangen ist (in Sekunden).
Typen
Vec2
Darstellung eines 2-dimensionalen Vektors.
vec = Vec2(x, y)
vec = Vec2(f) # = Vec2(f, f) für Zahlen
vec = Vec2(v) # = v (Klon) für Vektoren
vec = Vec2() # = Vec2(0, 0)
Beispiele:
a = Vec2(2, 3)
b = Vec2(1)
c = Vec2(a)
d = Vec2()
bool
Bool'scher Wert
b = True
b = False
Layer
Schicht mit Name.
layer = Layer(name) # name ist ein string
Beispiele:
layer = Layer("platform")