pyxen.GridBody

Un GridBody est un composant de collision sur grille qui interagit avec un GridMap.

Pour les concepts de collision, consultez Collision.


Constructeur

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

Tous les paramètres sont par mot-clé uniquement.


Paramètres

ParamètreTypeDescription
pos(x, y)Position initiale en pixels
size(w, h)Taille du corps en pixels
move(x, y)Vecteur de déplacement
tagintTag du corps
mask(int, …)Tuple de tags de tuiles avec lesquels collisionner

Exemple

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

Attacher un GridBody

Lors du spawn() :

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

Ou plus tard :

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

Propriétés

move

Définir le vecteur de déplacement avec un tuple ou un Vector2i :

body.move = (1, 0)

La lecture de move renvoie un Vector2i :

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

Propriétés prévues

PropriétéDescription
posPosition du corps
sizeTaille du corps
tagTag du corps
maskMasque de collision

Système de tags

tag

Chaque corps possède un seul tag :

body.tag = TAG_PLAYER

mask

Le masque définit avec quels tags ce corps entre en collision :

body.mask = (TAG_WALL, TAG_MONSTER)

Interaction GridBody + GridMap

Un GridBody entre en collision avec les tuiles d’un GridMap et d’autres GridBodies en fonction du filtrage par tags.

Le GridBody doit être un enfant d’une entité GridMap pour que les collisions soient résolues.


Exemple de déplacement

body = player.body

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

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

Configuration minimale

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,)
    )
)

Pattern courant : Joueur contre murs

TAG_PLAYER = 1
TAG_WALL = 2

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

Si une tuile est définie avec :

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

Le joueur entrera en collision avec elle.