Tilemap
Узел тайловой сетки: атлас-текстура, нарезанная на ячейки, разложенная на равномерной сетке,
загруженная один раз и отрисованная нативно с покадровым отсечением по виду — рисуй большой уровень
одним узлом. Расширяет Node2D, поэтому имеет полный трансформ, иерархию и
поверхность слоёв.
Обзор
const tiles = await Texture2D.load(asset('./tiles.png'))
const map = new Tilemap({
texture: tiles,
cols: 20, rows: 5, // размер карты в тайлах
tile: 32, // каждая ячейка 32×32 мировые единицы
atlas: [8, 4], // текстура содержит 8×4 тайла
data: [ // строка 0 = ВЕРХНЯЯ строка; -1 = пусто
-1, -1, -1, /* … cols*rows элементов … */
0, 1, 1, /* … */
],
})
map.position = [0, 0] // НИЖНИЙ-ЛЕВЫЙ угол карты
scene.add(map)Создание
new Tilemap(options: {
texture: Texture2D
cols: number // ширина карты в тайлах
rows: number // высота карты в тайлах
tile: number | [w, h] // экранный размер ячейки в мировых единицах (число = квадрат)
atlas: [atlasCols, atlasRows] // как текстура нарезана на тайлы
data: number[] | Int32Array // построчные индексы атласа, длина cols*rows; -1 = пусто
})
map.cols, map.rows // только чтениеdata— построчно, строка 0 сверху карты (читается как текст уровня в исходнике), хотя мировой Y смотрит вверх.- Индексы атласа тоже считаются построчно по сетке атласа: 0 — верхний-левый тайл атласа.
positionузла — нижний-левый угол карты.
Редактирование ячеек
map.setTile(x: number, y: number, index: number): this // координаты сетки как в data (строка 0 = верх)Устанавливает одну ячейку в индекс атласа (-1 очищает). Дёшево — сетка живёт нативно.
Ограничения
Tilemap — это статическая равномерная сетка. Не предоставляется (на момент текущего исходника):
- анимированные тайлы — меняй ячейки сам через
setTileпри необходимости - коллизия на тайл — строй коллизию уровня отдельно, напр. невидимые
Node2Dс боксами/сегментамиShape2Dи статическими теламиPhysics2D - отражение/поворот на тайл — запеки зеркальные/повёрнутые варианты в атлас