Phaser — мощная библиотека для создания 2D-игр на JavaScript, и интеграция с картами, созданными в редакторе Tiled Map Editor, позволяет легко управлять уровнями и игровыми сценами. Tiled поддерживает экспорт карт в формате JSON, что идеально подходит для Phaser, так как библиотека предоставляет встроенные методы для загрузки и обработки этих данных.
Файл карты Tiled в формате JSON содержит несколько ключевых компонентов:
tilesets — набор тайлов, используемых на карте. Каждое tileset содержит:
firstgid — идентификатор первого тайла в наборе.source — путь к файлу tileset или встроенные
данные.tilewidth и tileheight — размеры каждого
тайла в пикселях.tilecount — общее количество тайлов.layers — слои карты, каждый из которых может быть:
tilelayer — слой, заполненный тайлами.objectgroup — слой с объектами (например, позиции
врагов, предметов). Слой содержит массив data,
представляющий тайлы в виде числовых идентификаторов, или массив
objects с объектами.properties — пользовательские свойства карты или отдельных слоев. Позволяют задавать дополнительную информацию, например, скорость движения платформ или зоны спауна.
Пример структуры слоя tilelayer:
{
"type": "tilelayer",
"name": "Ground",
"width": 10,
"height": 10,
"data": [1, 1, 2, 3, ...]
}
Пример objectgroup:
{
"type": "objectgroup",
"name": "Enemies",
"objects": [
{"id": 1, "name": "Slime", "x": 64, "y": 128, "width": 32, "height": 32}
]
}
Phaser предоставляет систему загрузки ресурсов через
preload(). JSON-файл карты можно загрузить с помощью метода
this.load.tilemapTiledJSON().
Пример загрузки:
function preload() {
this.load.tilemapTiledJSON('level1', 'assets/maps/level1.json');
this.load.image('tiles', 'assets/tilesets/tiles.png');
}
После загрузки создаётся объект карты:
function create() {
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tilesetName', 'tiles');
const groundLayer = map.createLayer('Ground', tileset, 0, 0);
const decorationLayer = map.createLayer('Decoration', tileset, 0, 0);
}
Object layers позволяют размещать игровые объекты, такие как враги,
NPC, точки спауна, ловушки и интерактивные предметы. Для их обработки
используется метод map.getObjectLayer('LayerName').
Пример создания спрайтов на основе объектов:
const enemies = map.getObjectLayer('Enemies')['objects'];
enemies.forEach(enemy => {
this.physics.add.sprite(enemy.x, enemy.y, 'slime');
});
Можно использовать свойства объектов Tiled для задания дополнительных параметров, например, скорости движения или типа врага:
enemies.forEach(enemy => {
const sprite = this.physics.add.sprite(enemy.x, enemy.y, 'slime');
sprite.speed = enemy.properties.find(p => p.name === 'speed').value;
});
Phaser поддерживает коллизии тайлов через
setCollisionByProperty или
setCollisionBetween. Для слоев, где тайлы должны
блокировать движение персонажа, задаются специальные свойства в Tiled,
например, collides=true.
Пример установки коллизий:
groundLayer.setCollisionByProperty({ collides: true });
this.physics.add.collider(player, groundLayer);
Можно также использовать
setCollisionBetween(first, last) для указания диапазона ID
тайлов, с которыми будет работать коллизия.
Карты Tiled поддерживают тайлы с анимацией. В JSON-файле они
представлены через массив animation внутри тайла,
содержащий последовательность фреймов и время показа. Phaser позволяет
считывать эти данные и автоматически проигрывать анимацию тайлов.
Пример анимации тайлов:
tileset.tiles.forEach(tile => {
if (tile.animation) {
tile.animation.forEach(frame => {
// Phaser сам обрабатывает анимацию при создании слоя
});
}
});
Кроме того, тайлы можно менять динамически в игре с помощью
putTileAt() и removeTileAt(), что позволяет
создавать разрушимые платформы или активные зоны.
Использование формата Tiled и экспорта в JSON обеспечивает удобную интеграцию с Phaser, делая процесс создания уровней модульным, управляемым и расширяемым. Это позволяет реализовать как простые платформеры, так и сложные 2D-игры с множеством объектов, интерактивными элементами и динамическими уровнями.