pyxen.GridMap

Un GridMap es un contenedor espacial formado por celdas organizadas en filas y columnas.

Define la disposición de tiles, el tamaño de celda, el atlas de tiles opcional y el espacio de colisión para GridBody.

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


Constructor

GridMap(
    *,
    rows=None,
    columns=None,
    size=None,
    image=None,
    tilemap=None
)

Todos los parámetros son solo por nombre.


Parámetros

ParámetroTipoDescripción
rowsintNúmero de filas
columnsintNúmero de columnas
size(width, height)Tamaño de celda en píxeles
imagestrNombre de imagen del atlas de tiles
tilemapstrNombre de un asset .tilemap para precargar

Ejemplo

level_map = GridMap(
    rows=10,
    columns=16,
    size=(16, 16),
    image="tileset"
)

Adjuntar un GridMap

Durante spawn:

level = world.spawn(
    map=GridMap(
        rows=10,
        columns=16,
        size=(16, 16),
        image="tileset"
    )
)

O después:

entity = world.spawn()
entity.map = GridMap(rows=8, columns=8, size=(16, 16))

Propiedades

map.active

PropiedadTipoPor defecto
activeboolTrue

Controla si la simulación de colisiones se ejecuta para este mapa. Cuando es False, no se procesan movimientos de cuerpos, colisiones ni callbacks para ningún GridBody adjunto a este mapa.

# Pausar colisiones (ej. menú de pausa)
level.map.active = False

# Reanudar colisiones
level.map.active = True

map.rows, map.columns

PropiedadTipo
rowsint
columnsint

El tamaño del mapa en celdas: el que se le dio al crearlo, o el tamaño con el que se pintó su .tilemap. Solo lectura. Multiplicados por el tamaño de celda, dan el tamaño del mapa en píxeles, para los límites de una cámara o para mantener un cuerpo dentro del mapa.

# El tamaño del mapa en píxeles
w = level.map.columns * 16
h = level.map.rows * 16

Modificar tiles

Usa map.set() para configurar tiles.

map.set(
    row=0,
    column=1,
    tile=(tile_column, tile_row),
    tag=optional_tag
)

Parámetros

ParámetroTipoDescripción
rowintÍndice de fila de la cuadrícula
columnintÍndice de columna de la cuadrícula
tile(x, y)Coordenadas del tile en el atlas
tagintEtiqueta de colisión opcional

Ejemplo: establecer un tile

level.map.set(
    row=2,
    column=5,
    tile=(3, 1)
)

Ejemplo: añadir etiqueta de colisión

level.map.set(
    row=4,
    column=2,
    tile=(0, 0),
    tag=1  # wall
)

Leer tiles

map.get(row, column) responde qué hay en una celda, como un par (tile, tag): lo que map.set() puso ahí, o lo que pintó el .tilemap.

tile, tag = level.map.get(row, column)

Parámetros

ParámetroTipoDescripción
rowintÍndice de fila de la cuadrícula
columnintÍndice de columna de la cuadrícula

Devuelve

ValorTipoDescripción
tile(x, y) o -1Las coordenadas del tile en el atlas; -1 para una celda sin tile (vacía, o solo una etiqueta)
tagintLa etiqueta de la celda, 0 cuando no tiene

Fuera del mapa, get responde (-1, 0) en lugar de un error, así un juego puede mirar una celda más allá de un borde.

Ejemplo: leer una celda

tile, tag = level.map.get(4, 2)
if tag == 1:
    print("a wall")
if tile == -1:
    print("aquí no hay nada pintado")

Objetos

Un .tilemap puede nombrar objetos (things) en sus celdas: un cofre, una puerta, el inicio del héroe. map.things() los lista como (name, row, column), por fila y luego por columna. Un mapa sin objetos, o creado con rows/columns explícitos, da una lista vacía.

village = world.spawn(map=GridMap(tilemap="village"))

for name, row, column in village.map.things():
    if name == "chest":
        place_chest(row, column)   # la función propia del juego

El nombre de un objeto es el de un sprite, o el de un tipo (kind): un tipo es un nombre para un fotograma de un sprite, así que dos tipos pueden salir de un mismo sprite (un slime y un guard). Una celda tiene un solo objeto. Nada mueve ni dibuja un objeto; tu código decide en qué se convierte cada nombre. Cada llamada da una lista nueva, que puedes ordenar o vaciar libremente.

En el archivo, ambas son claves opcionales, ausentes cuando están vacías:

"kinds": [ {"frame": 1, "name": "guard", "sprite": "slime"} ],
"things": [ {"column": 16, "name": "chest", "row": 1} ]

Coordenadas de la cuadrícula

  • Las filas aumentan verticalmente
  • Las columnas aumentan horizontalmente

Los índices fuera de los límites se ignoran de forma segura.


GridMap + GridBody

Un GridBody interactúa con el GridMap para colisión, resolución de movimiento y detección de disparadores.

GridBody debe ser hijo de la entidad GridMap.

level = world.spawn(
    map=GridMap(
        rows=8,
        columns=8,
        size=(16, 16),
        image="tiles"
    )
)

player = world.spawn(
    body=GridBody(),
    parent=level
)

Ejemplo mínimo: nivel básico

level = world.spawn(
    map=GridMap(
        rows=8,
        columns=8,
        size=(16, 16),
        image="tiles"
    )
)

# Crear suelo
for r in range(8):
    for c in range(8):
        level.map.set(row=r, column=c, tile=(0, 0))

# Crear paredes
for c in range(8):
    level.map.set(row=0, column=c, tile=(1, 0), tag=1)
    level.map.set(row=7, column=c, tile=(1, 0), tag=1)

Etiquetas

tag es metadato opcional por tile.

Usos típicos:

  • 0 — vacío
  • 1 — pared
  • 2 — agua
  • 3 — zona de daño

Las etiquetas son interpretadas por tu sistema de juego o colisión.