В Phaser обработка столкновений и проверка пересечений объектов является одной из ключевых задач при разработке игр. Phaser предоставляет мощные инструменты для работы с физикой, коллизиями и пересечениями спрайтов, групп и других игровых объектов. Понимание этих механизмов позволяет создавать динамичные сцены, реагирующие на действия игрока или поведения NPC.
Коллизия (Collision) — это физическое взаимодействие между объектами, при котором они не могут проходить друг сквозь друга. Phaser позволяет автоматически обрабатывать коллизии с использованием встроенных физических движков: Arcade Physics, Matter.js или Impact.js.
Пересечение (Overlap) — проверка нахождения двух объектов в одной области без принудительного изменения их положения. Используется для триггеров, активации событий, сборов предметов и других логических взаимодействий.
Физические тела (Bodies) — объекты, которым присвоена физика. Для Arcade Physics это прямоугольные или круговые тела, для Matter.js — более сложные формы, включая полигоны и цепи.
Arcade Physics — легковесный движок, оптимальный для 2D игр. Основные методы для проверки пересечений:
this.physics.add.collider(obj1, obj2, callback, processCallback, context)
Создает коллизию между obj1 и obj2.
callback вызывается при столкновении,
processCallback позволяет условно фильтровать
события.
this.physics.add.overlap(obj1, obj2, callback, processCallback, context)
Проверяет пересечение без физического реагирования. Полезно для
активации эффектов или начисления очков при сборе предметов.
Пример коллизии и пересечения:
this.physics.add.collider(player, walls, () => {
console.log('Игрок столкнулся со стеной');
});
this.physics.add.overlap(player, coins, (player, coin) => {
coin.disableBody(true, true); // убирает монету с поля
score += 10;
});
Ключевые моменты:
Group или Physics Group).Phaser позволяет организовывать объекты в группы для удобной работы с коллизиями и пересечениями:
Пример: столкновение игрока с группой врагов
this.physics.add.collider(player, enemies, (player, enemy) => {
player.setTint(0xff0000);
player.disableBody(true, true);
});
Пример пересечения игрока с группой бонусов:
this.physics.add.overlap(player, bonuses, (player, bonus) => {
bonus.destroy();
playerScore += 50;
});
Особенности работы с группами:
processCallback, чтобы
ограничить обработку только некоторыми объектами.this.physics.add.collider(player, enemies, null, (player, enemy) => {
return enemy.active; // коллизия только с активными врагами
});
Тело объекта определяется через setSize
и setOffset. Это важно для точного контроля
пересечений:
player.body.setSize(32, 48);
player.body.setOffset(16, 16);
Точная настройка тел критична для платформеров и игр с мелкими объектами, где визуальные границы и реальные тела могут различаться.
Иногда требуется более точный контроль, без использования встроенных
коллайдеров. Для Arcade Physics доступен метод
Phaser.Geom.Intersects:
if (Phaser.Geom.Intersects.RectangleToRectangle(player.getBounds(), coin.getBounds())) {
coin.disableBody(true, true);
score += 10;
}
Методы пересечения включают:
RectangleToRectangle — проверка прямоугольников.CircleToCircle — проверка кругов.RectangleToCircle — смешанные формы.Эти методы позволяют реализовать нестандартные логики взаимодействия, например, активировать эффекты в зоне видимости или при приближении к объекту.
Для более сложных коллизий используется Matter.js, встроенный в Phaser 3:
this.matter.world.on('collisionstart', (event) => {
event.pairs.forEach(pair => {
const bodyA = pair.bodyA;
const bodyB = pair.bodyB;
if (bodyA.gameObject.label === 'player' && bodyB.gameObject.label === 'enemy') {
console.log('Столкновение игрока с врагом');
}
});
});
Преимущества Matter.js:
overlap, а не
collider, чтобы не нагружать физический движок.Phaser.Geom.Intersects без физических тел.Применение этих инструментов позволяет строить интерактивные игровые сцены с точной обработкой столкновений и триггеров, обеспечивая плавный и предсказуемый игровой процесс.