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
| Parameter | Typ | Beschreibung |
|---|---|---|
pos | (x, y) | Anfangsposition in Pixeln |
size | (w, h) | Körpergröße in Pixeln |
move | (x, y) | Bewegungsvektor |
tag | int | Kö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
| Eigenschaft | Beschreibung |
|---|---|
pos | Körperposition |
size | Körpergröße |
tag | Körper-Tag |
mask | Kollisionsmaske |
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.