Physik Engine - HerrSturm/EckenerProject GitHub Wiki

Konzept

Die zentrale Komponente ist die Klasse HitBox. Sie stellt eine Rechteck dar, das mit anderen HitBoxen interagieren kann. Eine weitere Klasse CollisionManager verwaltet diese Interaktionen.

HitBoxen 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")