Phaser предоставляет мощный механизм работы с тайловыми картами, который позволяет создавать сложные игровые миры и эффективно обрабатывать взаимодействия объектов с тайлами. Одним из ключевых элементов этого механизма являются коллизии тайлов, обеспечивающие корректное столкновение спрайтов с окружением.
Тайловая карта в Phaser создаётся через
this.make.tilemap или this.add.tilemap, после
чего можно подключать тайловые наборы (tilesets) и
создавать слои (tilemap.createLayer). Каждый слой
представляет собой сетку тайлов, где каждый тайл имеет набор свойств,
определяющих его поведение.
Свойства тайлов могут быть добавлены в редакторе карт (например,
Tiled) и включать такие флаги, как collides,
solid, isObstacle и другие. Phaser использует
эти свойства для автоматического определения коллизий.
setCollisionByPropertyМетод setCollisionByProperty позволяет включить коллизию
для тайлов, основываясь на их пользовательских свойствах. Синтаксис:
layer.setCollisionByProperty({ propertyName: value });
collides или solid).Пример использования:
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tiles', 'tilesImage');
const layer = map.createLayer('Ground', tileset);
layer.setCollisionByProperty({ collides: true });
В этом примере все тайлы, у которых свойство collides
установлено в true, будут участвовать в столкновениях.
После этого спрайты, добавленные с помощью
this.physics.add.sprite, смогут корректно реагировать на
коллизии с этими тайлами.
Преимущества метода
setCollisionByProperty:
setCollisionBetweenМетод setCollisionBetween используется, когда необходимо
задать коллизии для диапазона индексов тайлов. Синтаксис:
layer.setCollisionBetween(startIndex, endIndex);
Пример:
layer.setCollisionBetween(1, 10);
Все тайлы с индексами от 1 до 10 будут коллизионными. Этот подход эффективен, когда тайлы одного типа идут подряд в тайловом наборе и имеют одинаковое поведение.
Особенности метода
setCollisionBetween:
В крупных проектах часто применяется комбинация обоих методов.
Например, статические платформы можно включить через
setCollisionBetween, а динамически изменяемые объекты или
специальные тайлы — через setCollisionByProperty. Это
повышает гибкость управления коллизиями.
Пример комбинирования:
layer.setCollisionBetween(1, 50); // базовые тайлы платформ
layer.setCollisionByProperty({ isObstacle: true }); // специальные препятствия
После настройки коллизий необходимо добавить физический объект и связать его с тайловым слоем:
const player = this.physics.add.sprite(100, 200, 'player');
this.physics.add.collider(player, layer);
Метод add.collider обеспечивает автоматическое
взаимодействие между спрайтом и коллизионными тайлами слоя. Спрайт
корректно останавливается при столкновении и реагирует на физику
(гравитацию, движение).
Методы setCollisionByProperty и
setCollisionBetween можно вызывать повторно для обновления
коллизий на лету. Например, если тайл меняется во время игры:
layer.putTileAt(5, 10, 10); // заменяем тайл
layer.setCollisionBetween(5, 5); // обновляем коллизию для нового тайла
Это особенно полезно для платформеров с разрушаемыми или перемещаемыми тайлами.
setCollisionByProperty) для
точного управления коллизиями.setCollisionBetween — это экономит ресурсы и упрощает
код.