Phaser — это мощная игровая библиотека для разработки 2D-игр на JavaScript, предоставляющая гибкие инструменты для работы с тайлмапами. Динамическая замена тайлов позволяет изменять структуру уровня во время выполнения игры, что критично для создания интерактивных миров, разрушимых объектов или адаптивных уровней.
Tilemap — это объект, представляющий уровень игры, составленный из тайлов. Тайлы загружаются из Tileset — графического ресурса, содержащего сетку изображений одинакового размера.
Создание тайлмапа в Phaser 3:
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tilesetName', 'tilesetImage');
const layer = map.createLayer('Tile Layer 1', tileset, 0, 0);
Здесь level1 — JSON-файл тайлмапа,
tilesetName — название тайлсета в редакторе, а
tilesetImage — загруженная текстура через
this.load.image.
Ключевой момент: слой (layer) хранит
информацию о каждом тайле, включая его индекс, координаты и свойства.
Для динамических изменений именно этот объект используется для замены
или модификации тайлов.
Phaser предоставляет несколько способов изменить тайл на лету:
layer.putTileAt(5, 10, 7); // ставим тайл с индексом 7 на позицию (10, 7)
oldIndex на newIndex в
слое.layer.replaceByIndex(3, 8); // заменяет все тайлы с индексом 3 на 8
layer.removeTileAt(4, 2);
indexes на
заданной области.layer.randomize(0, 0, 10, 5, [1, 2, 3, 4]);
Особенности работы:
Тайлы могут иметь пользовательские свойства, определяемые в редакторах (Tiled, LDtk и др.). Эти свойства используются для управления логикой игры при динамических изменениях.
Пример проверки свойства перед заменой:
const tile = layer.getTileAt(5, 7);
if (tile && tile.properties.destructible) {
layer.putTileAt(9, 5, 7); // ставим "разрушенный" тайл
}
Комбинация тайл-свойств и методов замены позволяет реализовать:
destructible меняется индекс тайла на разрушенный
вариант.layer.forEachTile(tile => {
if (tile.properties.spawnable) {
const randomIndex = Phaser.Math.RND.pick([10, 11, 12]);
tile.index = randomIndex;
}
});
cull для невидимых тайлов, чтобы Phaser не
отрисовывал их каждый кадр.Если тайлы используются как коллайдеры, необходимо синхронизировать физические объекты после замены:
layer.setCollisionByProperty({ collides: true });
this.physics.world.convertTilemapLayer(layer);
Любая динамическая замена тайлов, затрагивающая коллайдеры, требует пересоздания коллизий для корректной работы физики.
putTileAt,
replaceByIndex, removeTileAt и
randomize для изменения тайлов.Динамическая замена тайлов в Phaser позволяет создавать интерактивные, изменяемые и процедурно генерируемые миры, делая игру более живой и адаптивной.