Проверка перекрытий: overlap

Phaser — это мощная библиотека для создания 2D-игр на JavaScript, которая предоставляет гибкие инструменты для работы с физикой и коллизиями. Одной из ключевых возможностей является проверка перекрытий между объектами. В Phaser эта проверка реализуется через метод overlap, который позволяет определить, пересекаются ли два объекта или группы объектов, без автоматического воздействия на их физическое состояние.


Основы метода overlap

Метод overlap используется для обнаружения столкновений между объектами без применения физических сил. В отличие от метода collide, который реагирует на столкновение и может менять скорость, положение или направление объектов, overlap только сообщает о факте пересечения.

Сигнатура метода в Phaser 3:

this.physics.add.overlap(object1, object2, callback, processCallback, callbackContext);
  • object1 — первый объект или группа объектов (Sprite, Group, PhysicsGroup).
  • object2 — второй объект или группа объектов.
  • callback — функция, вызываемая при обнаружении перекрытия.
  • processCallback (необязательный) — функция фильтрации, которая возвращает true или false, определяя, нужно ли считать перекрытие.
  • callbackContext (необязательный) — контекст, в котором вызываются функции.

Использование overlap с одиночными объектами

Для проверки перекрытия двух спрайтов можно использовать следующий пример:

let player = this.physics.add.sprite(100, 100, 'player');
let coin = this.physics.add.sprite(150, 100, 'coin');

this.physics.add.overlap(player, coin, collectCoin, null, this);

function collectCoin(player, coin) {
    coin.disableBody(true, true);
    console.log('Монета собрана!');
}

В этом примере:

  • player и coin проверяются на перекрытие каждый кадр.
  • При пересечении вызывается функция collectCoin.
  • Метод disableBody(true, true) скрывает объект и отключает его физику, что часто используется для удаления объектов из игры.

Использование overlap с группами объектов

Часто необходимо проверять перекрытия между игроком и целой группой объектов, например, с врагами или предметами:

let coins = this.physics.add.group({
    key: 'coin',
    repeat: 10,
    setXY: { x: 50, y: 50, stepX: 70 }
});

this.physics.add.overlap(player, coins, collectCoin, null, this);

Phaser автоматически проверяет перекрытия каждого объекта группы с игроком и вызывает callback для каждого пересечения. Это удобно для работы с массивами объектов без написания дополнительных циклов.


Фильтрация перекрытий: processCallback

Иногда нужно проверять перекрытие только при определённых условиях. Для этого используется processCallback, который позволяет отфильтровать пересечения:

this.physics.add.overlap(player, enemies, handleHit, filterHit, this);

function filterHit(player, enemy) {
    // Проверяем, активен ли враг
    return enemy.active;
}

function handleHit(player, enemy) {
    player.setTint(0xff0000);
    console.log('Игрок получил урон!');
}

В этом примере:

  • filterHit возвращает true только для активных врагов.
  • handleHit вызывается только для объектов, прошедших фильтр.

Особенности работы с overlap

  1. Нет автоматической реакции физики Перекрытие не изменяет скорость или положение объектов, оно лишь сообщает о событии.

  2. Поддержка всех физических тел Phaser Метод работает с Arcade, Matter и другими физическими движками Phaser.

  3. Проверка на кадр Проверка перекрытий выполняется каждый кадр, что обеспечивает мгновенную реакцию объектов.

  4. Сложные проверки через группы Можно передавать как одиночные объекты, так и группы, включая PhysicsGroup или StaticGroup.

  5. Сочетание с collide Иногда объекты сначала проверяют столкновение через collide, а отдельные события — через overlap. Это позволяет разделять физическое воздействие и игровые события.


Практические примеры использования

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

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

  • Использовать processCallback, чтобы исключить ненужные проверки и снизить нагрузку на производительность.
  • При работе с большим количеством объектов предпочтительно использовать группы, а не индивидуальные объекты.
  • Для статических объектов, которые не двигаются, рекомендуется использовать StaticGroup, что ускоряет проверку перекрытий.

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