О чем этот пример
Система частиц (Particle Emitter) — это ключевой инструмент для создания динамичных визуальных эффектов в играх: от взрывов и огня до магии и погодных явлений. В Phaser 3 настройка эмиттера с помощью конфигурационного объекта позволяет быстро и гибко описывать сложное поведение тысяч частиц, что значительно ускоряет разработку. В этой статье мы разберем, как создать базовый эмиттер частиц из изображения, используя декларативный подход, и подробно объясним параметры конфига.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.55.2.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('spark', 'assets/particles/blue.png');
}
create ()
{
const particles = this.add.particles('spark');
const emitter = particles.createEmitter({
x: 400,
y: 300,
angle: { min: 180, max: 360 },
speed: 400,
gravityY: 350,
lifespan: 4000,
quantity: 6,
scale: { start: 0.1, end: 1 },
blendMode: 'ADD'
});
}
}
const config = {
type: Phaser.WEBGL,
width: 800,
height: 600,
backgroundColor: '#000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Подготовка сцены и загрузка ассетов
Любая работа с ресурсами в Phaser начинается с метода preload. В данном примере мы загружаем одно изображение, которое будет служить текстурой для наших частиц.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('spark', 'assets/particles/blue.png');
}
Здесь setBaseURL устанавливает базовый URL для загрузки, что удобно, если все ресурсы лежат в одной директории. Метод load.image регистрирует текстуру под ключом 'spark'. Именно этот ключ мы будем использовать позже для создания системы частиц.
Создание менеджера частиц и эмиттера
Основная логика создания эффекта находится в методе create. Сначала мы создаем менеджер частиц (Particle Manager), который отвечает за рендеринг и общее управление всеми эмиттерами, связанными с одной текстурой.
const particles = this.add.particles('spark');
Затем на этом менеджере мы вызываем метод createEmitter, передавая ему конфигурационный объект. Именно в этом объекте и заключается вся магия настройки поведения частиц.
const emitter = particles.createEmitter({
x: 400,
y: 300,
angle: { min: 180, max: 360 },
speed: 400,
gravityY: 350,
lifespan: 4000,
quantity: 6,
scale: { start: 0.1, end: 1 },
blendMode: 'ADD'
});
Разбор параметров конфигурации эмиттера
Давайте подробно рассмотрим, что делает каждый параметр в переданном объекте конфигурации.
- `x`, `y`: Координаты точки испускания частиц. В нашем случае это центр экрана (400, 300).
- `angle`: Угол вылета частицы. Использование объекта `{ min: 180, max: 360 }` означает, что каждая частица получит случайный угол в этом диапазоне (от 180 до 360 градусов), создавая веер в нижней полусфере.
- `speed`: Начальная скорость движения частицы в пикселях в секунду.
- `gravityY`: Имитация силы тяжести. Положительное значение тянет частицы вниз, заставляя их падать по параболе.
- `lifespan`: Время жизни частицы в миллисекундах. Через 4000 мс (4 секунды) частица автоматически уничтожится.
- `quantity`: Количество частиц, испускаемых за один вызов эмиттера (например, за кадр, если эмиттер работает постоянно).
- `scale`: Изменение размера частицы за время ее жизни. Объект `{ start: 0.1, end: 1 }` заставляет частицу плавно увеличиваться от 10% до 100% от исходного размера текстуры.
- `blendMode`: Режим наложения. Значение `'ADD'` складывает цвета частицы и фона, создавая яркие, светящиеся эффекты, что идеально подходит для искр или огня.
Сборка игры: конфигурация Phaser.Game
Весь пример завершается созданием экземпляра игры Phaser.Game, куда передается основной объект конфигурации.
const config = {
type: Phaser.WEBGL,
width: 800,
height: 600,
backgroundColor: '#000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Ключевые параметры:
- type: Рендерер. Phaser.WEBGL используется для лучшей производительности и поддержки таких эффектов, как blendMode 'ADD'.
- width, height: Размер игрового холста.
- backgroundColor: Цвет фона.
- parent: ID HTML-элемента, в который будет встроен canvas.
- scene: Класс сцены, который будет запущен сразу после инициализации игры.
Что попробовать дальше
Использование конфигурационного объекта в createEmitter — это мощный и читаемый способ создания сложных эффектов частиц в Phaser 3. Вы можете экспериментировать: измените angle на { min: 0, max: 180 }, чтобы частицы летели вверх; попробуйте режим наложения 'SCREEN'; добавьте параметр alpha для плавного исчезновения или rotate для вращения частиц. Комбинируя эти параметры, вы легко создадите дождь, снег, звёздное небо или реактивный след.
