О чем этот пример
Создание визуальных эффектов — ключевой элемент игровой атмосферы. В Phaser 3 система Particle Emitter позволяет генерировать сложные частицы с минимальными усилиями. Этот пример показывает, как привязать эмиттер частиц к действиям игрока, создавая отклик на клики мыши или касания. Вы научитесь настраивать жизненный цикл, скорость, гравитацию и внешний вид частиц, оживляя статичные сцены.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('bg', 'assets/tweens/sky.png');
this.load.atlas('match3', 'assets/atlas/match3.png', 'assets/atlas/match3.json');
}
create ()
{
this.add.image(400, 300, 'bg');
const emitter = this.add.particles(0, 0, 'match3', {
frame: [ 'Match3_Icon_30', 'Match3_Icon_29' ],
lifespan: 4000,
speed: { min: 200, max: 350 },
scale: { start: 0.4, end: 0 },
rotate: { start: 0, end: 360 },
gravityY: 200,
emitting: false
});
this.input.on('pointerdown', pointer => {
emitter.emitParticleAt(pointer.worldX, pointer.worldY, 4);
});
this.add.text(10, 10, 'Click to emit particles at pointer');
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Создание и настройка эмиттера
В методе create сначала добавляется фоновое изображение. Затем создается основной объект эмиттера частиц с помощью this.add.particles(). Ключевые параметры конфигурации:
- frame: Массив названий кадров из атласа, которые будут использоваться как текстуры для частиц.
- lifespan: Время жизни частицы в миллисекундах.
- speed: Объект с минимальной и максимальной скоростью разлёта.
- scale: Объект, задающий начальный и конечный размер частицы (здесь она уменьшается до нуля).
- rotate: Объект, определяющий вращение частицы за время её жизни.
- gravityY: Сила гравитации, притягивающая частицы вниз.
- emitting: false: Изначально эмиттер выключен, частицы будут создаваться только по команде.
const emitter = this.add.particles(0, 0, 'match3', {
frame: [ 'Match3_Icon_30', 'Match3_Icon_29' ],
lifespan: 4000,
speed: { min: 200, max: 350 },
scale: { start: 0.4, end: 0 },
rotate: { start: 0, end: 360 },
gravityY: 200,
emitting: false
});
Привязка эмиттера к вводу пользователя
Следующий шаг — заставить эмиттер реагировать на действия игрока. Мы настраиваем слушатель события pointerdown (клик мыши или касание) с помощью this.input.on. Внутри функции-обработчика вызывается метод эмиттера emitParticleAt. Этот метод принимает координаты X и Y в игровом мире (которые мы получаем из pointer.worldX и pointer.worldY) и количество частиц для одновременного создания.
this.input.on('pointerdown', pointer => {
emitter.emitParticleAt(pointer.worldX, pointer.worldY, 4);
});
В завершение сцены добавляется текстовое описание для пользователя.
this.add.text(10, 10, 'Click to emit particles at pointer');
Настройка игры и запуск сцены
Объект config определяет базовые настройки игры: тип рендерера, размеры холста, цвет фона, родительский HTML-элемент и главную сцену. После этого создаётся экземпляр игры new Phaser.Game(config), который запускает весь процесс.
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что попробовать дальше
Вы создали интерактивную систему частиц, которая реагирует на клики игрока. Это основа для множества эффектов: магические заклинания, следы от выстрелов, взрывы или сбор предметов. Для экспериментов попробуйте изменить параметры в конфигурации эмиттера: увеличьте gravityY для более резкого падения, добавьте больше кадров в массив frame для разнообразия или поиграйте со значениями scale и rotate. Также можно привязать эмиттер не к клику, а к движению мыши (pointermove) для создания шлейфов.
