Пересечения и проверки содержания

В Phaser обработка столкновений и проверка пересечений объектов является одной из ключевых задач при разработке игр. Phaser предоставляет мощные инструменты для работы с физикой, коллизиями и пересечениями спрайтов, групп и других игровых объектов. Понимание этих механизмов позволяет создавать динамичные сцены, реагирующие на действия игрока или поведения NPC.


Основные понятия

Коллизия (Collision) — это физическое взаимодействие между объектами, при котором они не могут проходить друг сквозь друга. Phaser позволяет автоматически обрабатывать коллизии с использованием встроенных физических движков: Arcade Physics, Matter.js или Impact.js.

Пересечение (Overlap) — проверка нахождения двух объектов в одной области без принудительного изменения их положения. Используется для триггеров, активации событий, сборов предметов и других логических взаимодействий.

Физические тела (Bodies) — объекты, которым присвоена физика. Для Arcade Physics это прямоугольные или круговые тела, для Matter.js — более сложные формы, включая полигоны и цепи.


Arcade Physics: базовые методы

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;
});

Ключевые моменты:

  • Collider автоматически предотвращает проникновение объектов друг сквозь друга.
  • Overlap лишь проверяет пересечение и вызывает функцию, не влияя на позиции объектов.
  • Для проверки можно использовать как отдельные спрайты, так и группы объектов (Group или Physics Group).

Работа с группами и массивами

Phaser позволяет организовывать объекты в группы для удобной работы с коллизиями и пересечениями:

  • StaticGroup — объекты, не подверженные движению, например, стены или платформы.
  • DynamicGroup — объекты, которые могут двигаться и взаимодействовать с другими телами.

Пример: столкновение игрока с группой врагов

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;
});

Особенности работы с группами:

  • Collider и Overlap автоматически перебирают все элементы группы.
  • Можно использовать фильтры 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);
  • setSize(width, height) — задает размеры тела независимо от спрайта.
  • setOffset(x, y) — смещает тело относительно спрайта.

Точная настройка тел критична для платформеров и игр с мелкими объектами, где визуальные границы и реальные тела могут различаться.


Проверка столкновений вручную

Иногда требуется более точный контроль, без использования встроенных коллайдеров. Для 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: расширенные возможности

Для более сложных коллизий используется 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:

  • Реалистичная физика объектов.
  • Возможность создавать сложные взаимодействия между динамическими телами.
  • Контроль сил, импульсов и столкновений на уровне физических свойств.

Рекомендации по оптимизации

  • Использовать StaticGroup для неподвижных объектов — повышает производительность.
  • Стараться минимизировать количество коллизий между динамическими телами.
  • Для мелких триггеров использовать overlap, а не collider, чтобы не нагружать физический движок.
  • При необходимости массовой проверки пересечений можно использовать массивы и Phaser.Geom.Intersects без физических тел.

Итоговые принципы

  • Collider → физическая коллизия, объект не проходит сквозь объект.
  • Overlap → логическая проверка пересечения, без воздействия на положение объектов.
  • Группы и массивы → удобство обработки множества объектов.
  • Настройка тел → точность коллизий и пересечений.
  • Ручные проверки → гибкость для особых случаев.
  • Выбор физического движка зависит от сложности взаимодействий и требований к производительности.

Применение этих инструментов позволяет строить интерактивные игровые сцены с точной обработкой столкновений и триггеров, обеспечивая плавный и предсказуемый игровой процесс.