Коллизии частиц с объектами

Для работы с коллизиями частиц и объектами в Phaser 3 необходима корректная настройка сцены и эмиттера частиц. Сначала создаётся конфигурация игры, включающая размеры канваса, тип рендеринга и указание сцены:

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    physics: {
        default: 'arcade',
        arcade: {
            gravity: { y: 300 },
            debug: true
        }
    },
    scene: {
        preload: preload,
        create: create,
        update: update
    }
};

const game = new Phaser.Game(config);

В preload загружаются необходимые ассеты: изображения, спрайты и текстуры для частиц.

function preload() {
    this.load.image('particle', 'assets/particle.png');
    this.load.image('platform', 'assets/platform.png');
}

В create создаётся группа объектов и эмиттер частиц:

function create() {
    // Создание платформы
    this.platforms = this.physics.add.staticGroup();
    this.platforms.create(400, 568, 'platform').setScale(2).refreshBody();

    // Настройка эмиттера частиц
    this.particles = this.add.particles('particle');
    this.emitter = this.particles.createEmitter({
        x: 400,
        y: 100,
        speed: { min: -200, max: 200 },
        angle: { min: 0, max: 360 },
        lifespan: 3000,
        gravityY: 300,
        quantity: 4,
        scale: { start: 0.5, end: 0 },
        collideWorldBounds: true
    });

    // Коллизия частиц с платформами
    this.physics.add.collider(this.particles, this.platforms, particleHit, null, this);
}

Реализация коллизий

Phaser 3 не обеспечивает встроенного метода collider для частиц напрямую через эмиттер. Для обработки столкновений необходимо использовать отдельные Particle объекты или обход через события эмиттера. Один из способов — динамически создавать спрайты при рождении частиц:

this.emitter.onParticleEmit(function(particle) {
    particle.sprite = this.physics.add.sprite(particle.x, particle.y, 'particle');
    particle.sprite.setVelocity(particle.velocity.x, particle.velocity.y);
    this.physics.add.collider(particle.sprite, this.platforms, function(p, plat) {
        p.setVelocity(0, 0);
        p.setGravityY(0);
    });
}, this);

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

Настройка свойств коллизий

Ключевые свойства для корректного взаимодействия частиц с объектами:

  • bounce — отражение частицы от поверхности.
particle.sprite.setBounce(0.8);
  • gravityY — сила гравитации, действующая на спрайт.
particle.sprite.setGravityY(300);
  • collideWorldBounds — предотвращает выход частиц за пределы канваса.
particle.sprite.setCollideWorldBounds(true);
  • velocity — начальная скорость движения.
particle.sprite.setVelocity(Phaser.Math.Between(-200, 200), Phaser.Math.Between(-300, -100));

Обработка событий столкновения

Для более сложных эффектов можно использовать callback функции, которые вызываются при контакте:

function particleHit(particle, platform) {
    particle.setVelocityY(particle.body.velocity.y * -0.5);
    particle.setVelocityX(particle.body.velocity.x * 0.5);
    particle.setTint(0xff0000); // визуальное изменение при столкновении
}

Это позволяет создавать реалистичные физические реакции: отскакивание, замедление, изменение цвета или исчезновение частицы после столкновения.

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

Создание физических спрайтов для каждой частицы может быть ресурсоёмким при большом количестве частиц. Для оптимизации рекомендуется:

  • Ограничивать количество активных частиц через maxParticles.
this.emitter.setMaxParticles(50);
  • Удалять спрайты после окончания жизненного цикла частицы.
particle.sprite.on('destroy', () => { particle.sprite = null; });
  • Использовать группы с пулом объектов (Group или Physics.Group) для повторного использования спрайтов вместо их постоянного создания и уничтожения.

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

  • Эмиттер частиц следует сочетать с физическими спрайтами для обеспечения коллизий.
  • Свойства физики (bounce, gravityY, velocity) регулируют реализм взаимодействия.
  • Колбэки при столкновении позволяют создавать сложные визуальные эффекты.
  • Оптимизация через группы и ограничение числа частиц критична для плавной работы на слабых устройствах.

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