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ètre | Type | Description |
|---|---|---|
pos | (x, y) | Position initiale en pixels |
size | (w, h) | Taille du corps en pixels |
move | (x, y) | Vecteur de déplacement |
tag | int | Tag 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 |
|---|---|
pos | Position du corps |
size | Taille du corps |
tag | Tag du corps |
mask | Masque 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.