pyxen.GridBody

Ein GridBody ist eine rasterbasierte Kollisionskomponente, die mit einer GridMap interagiert.

Kollisionskonzepte findest du unter Kollision.


Konstruktor

GridBody(
    *,
    pos=None,
    size=None,
    move=None,
    tag=None,
    mask=None
)

Alle Parameter sind Keyword-only.


Parameter

ParameterTypBeschreibung
pos(x, y)Anfangsposition in Pixeln
size(w, h)Körpergröße in Pixeln
move(x, y)Bewegungsvektor
tagintKörper-Tag
mask(int, …)Tupel von Tile-Tags zur Kollisionsprüfung

Beispiel

e = world.spawn(
    name="hero",
    sprite=sprite,
    layer=LAYER_HERO,
    body=GridBody(
        pos=(64, 64),
        size=(16, 16),
        move=(0, 0),
        tag=TAG_PLAYER,
        mask=(TAG_WALL, TAG_MONSTER)
    )
)

Einen GridBody anhängen

Beim spawn():

player = world.spawn(
    body=GridBody(pos=(32, 32), size=(16, 16))
)

Oder nachträglich:

entity = world.spawn()
entity.body = GridBody(size=(16, 16))

Eigenschaften

move

Setze den Bewegungsvektor mit einem Tupel oder Vector2i:

body.move = (1, 0)

Das Lesen von move gibt einen Vector2i zurück:

m = body.move
print(m.x, m.y)

Geplante Eigenschaften

EigenschaftBeschreibung
posKörperposition
sizeKörpergröße
tagKörper-Tag
maskKollisionsmaske

Tag-System

tag

Jeder Körper hat einen einzelnen Tag:

body.tag = TAG_PLAYER

mask

Die Maske definiert, mit welchen Tags dieser Körper kollidiert:

body.mask = (TAG_WALL, TAG_MONSTER)

GridBody + GridMap Interaktion

Ein GridBody kollidiert mit Tiles in einer GridMap und mit anderen GridBodies basierend auf Tag-Filterung.

GridBody muss ein Kind eines GridMap-Entity sein, damit Kollisionen aufgelöst werden.


Bewegungsbeispiel

body = player.body

if input.keyboard.left.down:
    body.move = (-1, 0)

if input.keyboard.right.down:
    body.move = (1, 0)

Minimales Setup

level = world.spawn(
    map=GridMap(
        rows=10,
        columns=10,
        size=(16, 16)
    )
)

player = world.spawn(
    parent=level,
    body=GridBody(
        pos=(16, 16),
        size=(16, 16),
        tag=1,
        mask=(2,)
    )
)

Häufiges Muster: Spieler vs. Wände

TAG_PLAYER = 1
TAG_WALL = 2

player = world.spawn(
    body=GridBody(
        pos=(32, 32),
        size=(16, 16),
        tag=TAG_PLAYER,
        mask=(TAG_WALL,)
    )
)

Wenn ein Tile gesetzt wird mit:

map.set(row=0, column=5, tag=TAG_WALL)

Dann kollidiert der Spieler damit.