TilemapRenderer

El componente TilemapRenderer renderiza un mapa basado en tiles. Usa una imagen de tileset como origen de los tiles individuales, dispuestos según un array de IDs de tile. Usa el Transform de la entidad para la posición. Consulta Renderizado para una visión general.

Cada tile se referencia mediante un ID, donde 0 representa espacio vacío. Los datos de tiles pueden proporcionarse directamente, o rellenarse a partir de un mapa de Tiled con el componente TiledWrapper.

Opciones

OpciónTipoValor por defectoDescripción
tilesetTilesetEl tileset que proporciona los tiles (ver más abajo).
datanumber[][]Array de IDs de tile. 0 es espacio vacío.
chunksChunk[][]Datos de tiles divididos en chunks, para mapas grandes.
widthnumber0Ancho del mapa en tiles.
heightnumber0Alto del mapa en tiles.
tileWidthnumberAncho del tile renderizado.
tileHeightnumberAlto del tile renderizado.
layerstring"Default"La capa de renderizado.
opacitynumber1Opacidad entre 0 y 1.
tintColorstringColor usado para tintar los tiles.
maskColorstringColor de máscara aplicado a los tiles.
maskColorMixnumberOpacidad del color de máscara entre 0 y 1.
smoothbooleanfalseSuaviza los píxeles. No recomendado para pixel art.
offsetVector2(0, 0)Desplazamiento en los ejes X-Y respecto de la posición de la entidad.

Tileset

CampoTipoDescripción
imageHTMLImageElement | stringLa imagen del tileset, o una cadena con la URL/nombre del recurso.
tileWidthnumberAncho del tile en píxeles.
tileHeightnumberAlto del tile en píxeles.
marginnumberEspacio en píxeles entre los tiles y los cuatro bordes de la imagen. Por defecto 0.
spacingnumberEspacio en píxeles entre tiles adyacentes. Por defecto 0.
animationsMap<number, TileAnimation>Tiles animados, indexados por el ID del tile a animar (ver más abajo).

Para un tileset cuyos tiles están extruidos 1 píxel, la imagen tiene un margen de 1 y un espaciado de 2:

tileset: {
    image: this.assetManager.getImage("tileset.png"),
    tileWidth: 16,
    tileHeight: 16,
    margin: 1,
    spacing: 2,
}

Animaciones de tiles

Un TileAnimation hace que un tile recorra una secuencia de IDs de tile del tileset. El mapa animations se define en el tileset y se indexa por el ID del tile que debe animarse: todos los tiles con ese ID reproducen la animación. Como las animaciones pertenecen al tileset, todos los tilemaps que lo usan las reproducen sincronizadas. Las animaciones siempre se repiten en bucle.

OpciónTipoValor por defectoDescripción
tilesnumber[][]La secuencia de IDs de tile a recorrer.
fpsnumber12Cuadros por segundo.

Cuando el tilemap proviene de Tiled, los tiles animados en el editor de mapas se mapean a este mapa automáticamente. Consulta TiledWrapper.

Ejemplo

import { Transform, TilemapRenderer } from "angry-pixel";

this.entityManager.createEntity([
    new Transform(),
    new TilemapRenderer({
        layer: "Default",
        tileset: {
            image: this.assetManager.getImage("tileset.png"),
            tileWidth: 16,
            tileHeight: 16,
        },
        data: [1, 2, 3, 4],
        width: 2,
        height: 2,
    }),
]);

Ejemplo de tiles animados

import { Transform, TilemapRenderer, TileAnimation } from "angry-pixel";

this.entityManager.createEntity([
    new Transform(),
    new TilemapRenderer({
        tileset: {
            image: this.assetManager.getImage("tileset.png"),
            tileWidth: 16,
            tileHeight: 16,
            // Cada tile con ID 3 recorre 3, 4, 5 a 6 fps.
            animations: new Map([[3, new TileAnimation({ tiles: [3, 4, 5], fps: 6 })]]),
        },
        data: [1, 2, 3, 4],
        width: 2,
        height: 2,
    }),
]);

Actualizar el tilemap en tiempo de ejecución

Los datos de los tiles se procesan una sola vez: el arreglo data y el arreglo chunks se generan uno a partir del otro, y se resuelve la altura del tilemap. Después de cambiar los datos en tiempo de ejecución, hay que llamar a refresh para que se procesen de nuevo.

refresh conserva el arreglo en el que se entregaron los tiles y vacía el que fue generado a partir de él, por lo que el cambio debe hacerse sobre el arreglo de origen: data para un tilemap definido con tiles, y chunks para un tilemap definido con chunks, que es el caso de los tilemaps infinitos de Tiled. Asignar data en un tilemap definido con chunks no tiene efecto, porque data se genera nuevamente a partir de los chunks.

const tilemapRenderer = this.entityManager.getComponent(entity, TilemapRenderer);

// un tilemap definido con tiles
tilemapRenderer.data = newData;
// un tilemap definido con chunks
tilemapRenderer.chunks = newChunks;

tilemapRenderer.refresh();

Esta operación es costosa, no debe llamarse en cada frame. Cuando el tilemap proviene de Tiled, también hay que refrescar el TiledWrapper, y el TilemapCollider si la entidad tiene uno.