Для работы с коллизиями частиц и объектами в 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);
В этом подходе каждый визуальный элемент частицы превращается в физический спрайт, который может участвовать в коллизиях с объектами сцены.
Ключевые свойства для корректного взаимодействия частиц с объектами:
particle.sprite.setBounce(0.8);
particle.sprite.setGravityY(300);
particle.sprite.setCollideWorldBounds(true);
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) регулируют реализм взаимодействия.Такая организация взаимодействия частиц с объектами обеспечивает точный контроль физики, гибкость в визуальных эффектах и стабильную производительность даже при больших сценах.