Проверка столкновений: collider

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

В Phaser 3 столкновения делятся на два основных типа:

  1. Arcade Physics – простая, производительная физика для 2D игр.
  2. Matter.js – более сложная, реалистичная физика с поддержкой силы, массы и трения.

Для большинства аркадных игр используется Arcade Physics, где collider проверяет столкновения объектов с прямоугольными или круговыми границами.

Создание 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) отключает объект и убирает его с экрана.

Коллайдер с tilemap layer:

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, столкновение игнорируется.
  • Такой подход обеспечивает гибкость в логике игры.

Оптимизация производительности

При работе с большим количеством объектов важно помнить:

  1. Использовать группы вместо отдельных коллайдеров для каждого объекта – это снижает нагрузку.
  2. Минимизировать количество объектов с физикой – можно использовать невидимые хитбоксы.
  3. Использовать 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();
  • Показывает границы тел объектов и коллайдеров.
  • Полезно для настройки размеров хитбоксов и проверки корректности столкновений.

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

  • Использовать Arcade Physics для быстрых 2D игр, Matter.js для реалистичной физики.
  • Создавать коллайдеры между объектами или группами.
  • Использовать processCallback для условной логики столкновений.
  • Применять overlap для проверок без физической реакции.
  • Настраивать физические свойства тел для точной симуляции.
  • Визуализировать тела для отладки и оптимизации.

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