Мультислойные карты в Phaser позволяют создавать сложные игровые уровни с несколькими слоями, где каждый слой может содержать уникальные объекты, тайлы или эффекты. Работа с такими картами чаще всего ведется через формат Tiled Map Editor (.json), что обеспечивает гибкость и удобство интеграции.
Для начала необходимо загрузить тайловую карту и соответствующие тайлсеты:
preload() {
this.load.tilemapTiledJSON('level1', 'assets/maps/level1.json');
this.load.image('tiles', 'assets/tilesets/tiles.png');
}
После загрузки создается карта и добавляются слои:
create() {
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tileset_name_in_tiled', 'tiles');
const backgroundLayer = map.createLayer('Background', tileset, 0, 0);
const groundLayer = map.createLayer('Ground', tileset, 0, 0);
const objectsLayer = map.createLayer('Objects', tileset, 0, 0);
groundLayer.setCollisionByProperty({ collides: true });
}
Ключевое здесь — setCollisionByProperty, который позволяет использовать свойства тайлов, заданные в Tiled, для определения коллизий.
Phaser рендерит слои в том порядке, в котором они создаются. Слои, созданные позже, будут перекрывать предыдущие. Для сложных сцен полезно использовать несколько слоев:
groundLayer.setDepth(1);
player.setDepth(2);
objectsLayer.setDepth(3);
Использование setDepth позволяет управлять визуальным наложением независимо от порядка создания слоев.
Tiled поддерживает объектные слои (Object Layers), которые удобно использовать для размещения точек появления врагов, триггеров или интерактивных элементов.
const objectsLayer = map.getObjectLayer('Enemies');
objectsLayer.objects.forEach(obj => {
const enemy = this.physics.add.sprite(obj.x, obj.y, 'enemy');
enemy.setOrigin(0, 1); // Совмещение с Tiled
});
Важно учитывать различие систем координат: Phaser использует верхний левый угол тайла как начало, а Tiled может иметь смещение по высоте.
Для больших карт критически важно правильно использовать рендеринг:
this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
Phaser поддерживает анимированные тайлы через тайлсеты, содержащие
несколько фреймов. Для этого используется
tileset.setTileAnimation или автоматическое считывание из
Tiled:
map.tilesets[0].tileData[1].animation = [
{ tileid: 1, duration: 100 },
{ tileid: 2, duration: 100 },
{ tileid: 3, duration: 100 }
];
Динамические тайлы также могут изменяться во время игры с помощью
putTileAt:
groundLayer.putTileAt(5, 10, 15); // Заменить тайл в координатах x=10, y=15 на ID=5
Коллизии в мультислойных картах настраиваются через:
collides: true)this.physics.add.collider(player, groundLayer);
Для сложной логики можно использовать кастомные коллизии:
groundLayer.setCollisionByExclusion([-1]); // Все тайлы, кроме пустых
setDepth для управления визуальным
наложением.Мультислойные карты в Phaser позволяют строить уровни с высокой детализацией и динамикой, обеспечивая гибкость при работе с графикой, физикой и игровыми событиями.