В библиотеке Phaser система столкновений играет ключевую роль в создании интерактивных игр. Для обработки столкновений используется объект Collider, который обеспечивает проверку пересечения игровых объектов и определяет реакции на эти события.
В Phaser 3 столкновения делятся на два основных типа:
Для большинства аркадных игр используется Arcade Physics, где
collider проверяет столкновения объектов с прямоугольными
или круговыми границами.
Чтобы создать коллайдер между двумя объектами, используется метод:
this.physics.add.collider(object1, object2, callback, processCallback, context);
Параметры метода:
object1, object2 – игровые объекты или
группы, между которыми проверяются столкновения.callback – функция, вызываемая при столкновении
(опционально).processCallback – функция, возвращающая
true или false, определяющая, следует ли
учитывать столкновение.context – контекст выполнения функций обратного
вызова.Пример базового коллайдера:
this.physics.add.collider(player, walls, () => {
console.log("Столкновение с стеной!");
});
Здесь player и walls – объекты с физикой
Arcade. При столкновении будет вызвана анонимная функция, регистрирующая
событие.
Phaser поддерживает группы и tilemap layers, что позволяет легко добавлять коллайдеры для множества объектов одновременно.
this.physics.add.collider(player, enemies, playerHitEnemy, null, this);
function playerHitEnemy(player, enemy) {
player.setTint(0xff0000);
enemy.disableBody(true, true);
}
enemies проверяются на столкновение
с player.disableBody(true, true) отключает объект и убирает его
с экрана.const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tiles', 'tilesImage');
const layer = map.createLayer('Walls', tileset);
layer.setCollisionByProperty({ collides: true });
this.physics.add.collider(player, layer);
setCollisionByProperty автоматически отмечает тайлы для
столкновений.Process Callback позволяет контролировать, будет ли столкновение учитываться. Это полезно для создания специальных условий, например, если объект временно неуязвим:
function shouldCollide(player, enemy) {
return !player.invincible;
}
this.physics.add.collider(player, enemy, hitEnemy, shouldCollide, this);
player.invincible равен true,
столкновение игнорируется.При работе с большим количеством объектов важно помнить:
overlap вместо
collider, если нужна только проверка пересечения
без реакции физики:this.physics.add.overlap(player, coins, collectCoin, null, this);
function collectCoin(player, coin) {
coin.disableBody(true, true);
player.score += 10;
}
overlap не изменяет позицию объектов, а лишь вызывает
callback при пересечении.
Коллайдеры работают на основе физических тел объектов. Основные свойства:
body.setVelocity(x, y) – скорость
объекта.body.setImmovable(true) – объект не
смещается при столкновении.body.setBounce(1) – коэффициент
отскока.body.setCollideWorldBounds(true) –
объект не выходит за пределы сцены.Пример взаимодействия с коллайдером:
player.setBounce(0.5);
player.setCollideWorldBounds(true);
this.physics.add.collider(player, walls, () => {
console.log("Игрок столкнулся с границей");
});
Phaser позволяет создавать несколько коллайдеров для одного объекта. Они выполняются в порядке объявления, что позволяет задавать приоритет обработки:
this.physics.add.collider(player, enemies, hitEnemy);
this.physics.add.collider(player, spikes, hitSpike);
hitEnemy, затем
hitSpike.Phaser предоставляет визуализацию тел для отладки:
this.physics.world.createDebugGraphic();
processCallback для условной логики
столкновений.overlap для проверок без физической
реакции.Collider в Phaser — это гибкий инструмент для управления столкновениями, который при правильной настройке позволяет создавать динамичные, отзывчивые игровые миры с минимальными затратами ресурсов.