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)
pos
Le coin en haut à gauche du corps, en pixels entiers, comme GridBody(pos=...) le prend. Les x et y de l’entité sont le centre du corps : pos plus la moitié de size.
Modifier pos place le corps à cet endroit d’un coup, à travers ce qui se trouve entre, sans collision. Son move est gardé, et les x et y de l’entité suivent dans la même image. Lire pos renvoie un Vector2.
body.pos = (32, 64) # coin en haut à gauche en (32, 64)
size = body.size
body.pos = (spot.x - size.x / 2, spot.y - size.y / 2) # son centre sur spot
size
La largeur et la hauteur du corps, en pixels entiers, telles que GridBody(size=...) les a fixées. En lecture seule ; un Vector2.
Propriétés prévues
| Propriété | Description |
|---|---|
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.