pyxen.Camera

Eine Camera definiert, was der Renderer in der Welt sieht.

Sie wird als Komponente an ein Entity angehängt. Der Renderer nutzt die Transform- und Kameraeigenschaften, um die Ansichts- und Projektionsmatrizen zu berechnen.

Eine Welt muss mindestens eine Kamera enthalten, um etwas zu rendern.


Kamera erstellen

camera = world.spawn(
    x=0,
    y=0,
    camera=Camera()
)

Oder nachträglich hinzufügen:

camera = world.spawn()
camera.camera = Camera()

Die Kamera nutzt den Entity-Transform

Eine Kamera speichert keine eigene Position — sie nutzt den Transform des Entity:

camera.x = 100
camera.y = 50
camera.rotation = 30
camera.scale = (2, 2)

Das Bewegen des Entity bewegt die Ansicht. Eltern-Transforms beeinflussen die Kamera ebenfalls.


Eigenschaften

zoom

camera.camera.zoom = 1.0

Typ: float Standard: 1.0

WertEffekt
1.0Standardansicht
>1Heranzoomen
<1Herauszoomen

Beispiel:

camera.camera.zoom = 2.0  # heranzoomen
camera.camera.zoom = 0.5  # herauszoomen

Zoom beeinflusst nur die Projektionsmatrix, nicht den Entity-Transform.


Beispiel: Einem Spieler folgen

player = world.spawn(x=0, y=0, sprite=hero)

camera = world.spawn(camera=Camera())

def update():
    camera.x = player.x
    camera.y = player.y

Oder einfacher — die Kamera als Kind des Spielers setzen:

player = world.spawn(x=0, y=0, sprite=hero)
camera = world.spawn(camera=Camera(), parent=player)

Herausgezoomte Kamera:

camera.camera.zoom = 0.75

Screen Shake & Flash

Eine Kamera kann zwei Bildschirmeffekte anwenden, beide in Frames gemessen (Pyxen läuft mit festen 30 fps):

cam = entity.camera

cam.shake(intensity, duration=8)   # jolt the view; fades out over `duration`
cam.flash(color, duration=8)       # full-screen colour that fades out
MethodeParameterBeschreibung
shake(intensity, duration=8)intensity in Pixeln, duration in FramesWackelt die Ansicht um einen deterministischen, abklingenden Versatz.
flash(color, duration=8)color als Color oder (r, g, b[, a]), duration in FramesBlendet eine bildschirmfüllende Farbüberlagerung über duration aus.
def on_hit():
    entity.camera.shake(3.0, 10)
    entity.camera.flash((1.0, 0.0, 0.0, 0.6), 6)

Beide Effekte sind deterministisch und werden daher im Time-Travel-Debugger identisch wiedergegeben.


Mehrere Kameras

Wenn mehrere Kameras existieren, wird die erste aktive Kamera in der Welt verwendet.