Группы и коллайдеры между группами

В Phaser группы объектов (Groups) представляют собой удобный инструмент для организации большого количества игровых сущностей. Они позволяют управлять сразу несколькими объектами, выполнять массовые действия, упрощают проверку коллизий и обработку событий.

Инициализация группы

Группа создаётся через this.add.group():

const enemies = this.add.group({
    key: 'enemy',       // ключ текстуры
    repeat: 5,          // количество копий
    setXY: { x: 100, y: 100, stepX: 70 } // начальные координаты и шаг
});

Ключевые параметры:

  • key – ключ спрайта или изображения для объектов группы.
  • repeat – сколько дополнительных объектов создать (помимо первого).
  • setXY – объект с координатами и шагами по осям.
  • setScale, setAlpha, setVelocity – можно массово задавать свойства для всех объектов группы.

Методы управления объектами группы

Группы предоставляют ряд методов для эффективного управления объектами:

  • getChildren() – возвращает массив всех объектов внутри группы.
  • getFirstDead() – находит первый «мертвый» объект для повторного использования.
  • add() – добавляет новый объект в группу.
  • remove() – удаляет объект из группы.
  • clear() – удаляет все объекты из группы.
  • setVelocityX(), setVelocityY(), setTint() – массовая установка свойств объектов.

Пример массового изменения свойств:

enemies.setVelocityX(100);
enemies.setTint(0xff0000);

Коллайдеры между группами

Phaser использует систему физики, где коллизии можно настраивать между отдельными объектами или целыми группами. Основной метод – this.physics.add.collider().

Создание коллайдера

this.physics.add.collider(player, enemies, hitEnemy, null, this);

Параметры метода:

  • object1 и object2 – объекты или группы для проверки столкновений.
  • callback – функция, вызываемая при столкновении.
  • processCallback – опциональная функция для дополнительной фильтрации столкновений.
  • callbackContext – контекст выполнения функции (обычно this).

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

this.physics.add.collider(bullets, enemies, destroyEnemy, null, this);

Функция обратного вызова может принимать параметры:

function destroyEnemy(bullet, enemy) {
    bullet.destroy();
    enemy.destroy();
}

Обработка пересечений без физического столкновения

Для сценариев, где нужно только реагировать на пересечение объектов, используется this.physics.add.overlap():

this.physics.add.overlap(player, powerUps, collectPowerUp, null, this);

Различия между collider и overlap:

  • collider – проверяет и реагирует на физическое столкновение (объекты не могут проходить друг через друга).
  • overlap – проверяет пересечение, но физическое движение не блокируется.

Массовая оптимизация коллизий

При работе с большим количеством объектов следует избегать проверки коллизий между всеми объектами без фильтрации. Phaser поддерживает следующие подходы:

  1. Использование групп для динамических объектов – например, все враги в одной группе, пули в другой. Коллизии проверяются между группами, а не между всеми объектами сцены.
  2. Фильтрация через processCallback – позволяет исключить ненужные проверки.

Пример фильтрации:

function bulletHitsEnemy(bullet, enemy) {
    return enemy.active; // столкновение учитывается только если враг активен
}

this.physics.add.collider(bullets, enemies, destroyEnemy, bulletHitsEnemy, this);

Взаимодействие нескольких коллайдеров

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

this.physics.add.collider(player, walls);
this.physics.add.collider(enemies, walls);
this.physics.add.collider(bullets, enemies, destroyEnemy);

Использование независимых коллайдеров обеспечивает гибкость управления и предотвращает конфликты обработки столкновений.

Управление состоянием объектов в группах

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

  • active – объект участвует в обновлениях и рендере.
  • visible – объект отображается на экране.
  • alive или isDead – пользовательские флаги для логики игры.

Массовое управление состоянием:

enemies.children.iterate(function(enemy) {
    enemy.setActive(false);
    enemy.setVisible(false);
});

Такой подход полезен для реализации повторного использования объектов (object pooling), что значительно снижает нагрузку на движок при большом количестве врагов или снарядов.

Итоговые рекомендации

  • Всегда использовать группы для логически связанных объектов.
  • Разделять динамические и статические объекты для оптимизации коллизий.
  • Применять overlap для триггеров и collider для физических столкновений.
  • Массово управлять свойствами через методы группы для сокращения кода и повышения производительности.
  • Фильтровать ненужные проверки через processCallback для оптимизации игры с большим количеством объектов.

Такой подход обеспечивает структурированность кода и эффективное управление сложными игровыми сценами в Phaser.