pyxen.GridBody

Un GridBody es un componente de colisión basado en cuadrícula que interactúa con un GridMap.

Para conceptos de colisión, consulta Colisión.


Constructor

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

Todos los parámetros son solo por nombre.


Parámetros

ParámetroTipoDescripción
pos(x, y)Posición inicial en píxeles
size(w, h)Tamaño del cuerpo en píxeles
move(x, y)Vector de movimiento
tagintEtiqueta del cuerpo
mask(int, …)Tupla de etiquetas de tiles con las que colisionar

Ejemplo

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

Adjuntar un GridBody

Durante spawn():

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

O después:

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

Propiedades

move

Establece el vector de movimiento con una tupla o Vector2i:

body.move = (1, 0)

Leer move devuelve un Vector2i:

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

Propiedades planificadas

PropiedadDescripción
posPosición del cuerpo
sizeTamaño del cuerpo
tagEtiqueta del cuerpo
maskMáscara de colisión

Sistema de etiquetas

tag

Cada cuerpo tiene una sola etiqueta:

body.tag = TAG_PLAYER

mask

La máscara define con qué etiquetas colisiona este cuerpo:

body.mask = (TAG_WALL, TAG_MONSTER)

Interacción GridBody + GridMap

Un GridBody colisiona con tiles en un GridMap y otros GridBodies basándose en el filtrado de etiquetas.

GridBody debe ser hijo de una entidad GridMap para que las colisiones se resuelvan.


Ejemplo de movimiento

body = player.body

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

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

Configuración mínima

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

Patrón común: jugador contra paredes

TAG_PLAYER = 1
TAG_WALL = 2

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

Si un tile se establece con:

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

El jugador colisionará con él.