Phaser предоставляет мощные инструменты для работы с тайловыми картами, позволяя создавать сложные уровни для 2D-игр с минимальными усилиями. Основным объектом для работы является Tilemap, который представляет собой карту, составленную из тайлов определённого размера, расположенных по сетке. Карта может быть создана вручную в редакторе типа Tiled или загружена из JSON-файла.
Tilemap создаётся с использованием метода
this.make.tilemap в сцене:
const map = this.make.tilemap({ key: 'level1' });
Здесь key — это идентификатор карты, загруженной через
this.load.tilemapTiledJSON. После создания карты необходимо
подключить tileset — набор изображений, используемых
для тайлов:
const tileset = map.addTilesetImage('tilesetName', 'tilesetImage');
Параметр tilesetName должен совпадать с названием
тайлсета в редакторе Tiled, а tilesetImage — ключ
загруженного изображения тайлов.
Tilemap может содержать несколько слоёв (layers).
Для их отображения используется метод createLayer:
const groundLayer = map.createLayer('Ground', tileset, 0, 0);
const wallsLayer = map.createLayer('Walls', tileset, 0, 0);
Параметры 0, 0 задают смещение слоя по оси X и Y. Слои
могут быть пассивными или
коллизийными. Для включения коллизий у тайлов,
определённых как препятствия, применяется метод
setCollisionByProperty:
wallsLayer.setCollisionByProperty({ collides: true });
Phaser позволяет интегрировать Tilemap с физическим движком (Arcade Physics) для работы с коллизиями:
this.physics.add.collider(player, wallsLayer);
В данном примере player — это спрайт игрока, а
wallsLayer — слой с тайлами, которые имеют свойство
collides: true. Коллизии автоматически учитывают форму
тайлов и предотвращают прохождение сквозь препятствия.
Тайловая карта может содержать объектные слои (object
layers), где размещаются позиции врагов, предметов или
триггеров. Для доступа к объектам используется метод
map.getObjectLayer:
const objectsLayer = map.getObjectLayer('Objects');
objectsLayer.objects.forEach(obj => {
if (obj.type === 'enemy') {
this.add.sprite(obj.x, obj.y, 'enemy');
}
});
Каждый объект хранит координаты, размеры, тип и дополнительные свойства, заданные в редакторе Tiled.
Тайлы могут быть анимированы с помощью метода
setTileIndexCallback и анимаций в редакторе. Для
динамического изменения тайла на карте используется метод
putTileAt:
groundLayer.putTileAt(42, 10, 15); // Устанавливает тайл с индексом 42 на координаты 10,15
Также можно получить тайл по координатам с помощью
getTileAt и изменять его свойства:
const tile = groundLayer.getTileAt(10, 15);
tile.alpha = 0.5;
Phaser оптимизирует рендеринг тайлов через culling,
отрисовывая только видимую часть карты. Для больших карт рекомендуется
использовать camera.setBounds и
layer.setScrollFactor(1) для синхронизации слоя с
камерой:
this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
groundLayer.setScrollFactor(1);
Tilemap поддерживает динамическое добавление и удаление тайлов во время игры, что позволяет создавать разрушаемое окружение, эффекты лавы или воду, которые распространяются по карте:
groundLayer.removeTileAt(5, 5); // Удаляет тайл
groundLayer.fill(10, 0, 0, 5, 5); // Заполняет прямоугольник тайлами с индексом 10
Разделение карты на слои позволяет управлять визуальными эффектами, такими как туман, световые эффекты или передвижение объектов. Например, слой облаков можно сделать полупрозрачным:
cloudsLayer.setAlpha(0.6);
Или задать слой, который будет двигаться медленнее, создавая эффект параллакса:
backgroundLayer.setScrollFactor(0.5);
Камера Phaser может следовать за игроком и учитывать размеры карты:
this.cameras.main.startFollow(player);
this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
Это гарантирует, что камера не выйдет за пределы тайловой карты и всегда отображает только игровую область.
Tiled позволяет задавать свойства для тайлов, слоёв и объектов.
Phaser поддерживает их чтение через tile.properties,
layer.properties или object.properties. Это
удобно для задания параметров, таких как скорость врагов, здоровье
объектов или уникальные события.
Работа с тайловыми картами в Phaser обеспечивает гибкость в создании уровней, коллизий и анимаций, позволяя строить как простые платформеры, так и сложные RPG или стратегии. Использование слоёв, объектных слоёв и динамических изменений тайлов открывает широкие возможности для управления игровой логикой и визуальными эффектами.