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éfinissez le vecteur de déplacement par frame avec un tuple ou un Vector2. move accepte des floats, vous pouvez donc vous déplacer à des vitesses sous-pixel :

body.move = (1, 0)      # 1 pixel/frame
body.move = (0.5, 0)    # half a pixel/frame — moves 1px every other frame

move persiste d’une frame à l’autre (c’est une vélocité par frame) ; réglez-le sur (0, 0) pour arrêter. Les positions restent parfaitement alignées sur les pixels : le déplacement fractionnaire s’accumule et est appliqué un pixel entier à la fois, de sorte que la collision et le rendu restent nets et déterministes.

La lecture de move renvoie un Vector2 :

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.