О чем этот пример
Игровая атмосфера часто складывается из деталей, и одна из самых эффектных — это системы частиц. В этом примере мы разберем, как создать простой, но реалистичный дождь, используя эмиттер частиц в Phaser. Вы научитесь управлять зоной появления частиц, их количеством и поведением, что станет основой для создания огня, снега, магических эффектов и многого другого.
Версия 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/skies/sky2.png');
this.load.image('rain', 'assets/sprites/rain.png');
}
create ()
{
this.add.image(400, 300, 'bg');
this.add.particles(0, 100, 'rain', {
x: { min: 100, max: 640 },
quantity: 2,
lifespan: 2500,
gravityY: 200
});
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Подготовка сцены и загрузка ассетов
Вся работа происходит в классе сцены, унаследованном от Phaser.Scene. Метод preload отвечает за загрузку изображений. Здесь мы используем два ассета: фоновое небо (sky2.png) и спрайт одной капли дождя (rain.png).
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('bg', 'assets/skies/sky2.png');
this.load.image('rain', 'assets/sprites/rain.png');
}
Задаем базовый URL для удобства, чтобы не писать полные пути к файлам. Ключи 'bg' и 'rain' — это внутренние имена текстур, по которым мы будем обращаться к ним в коде.
Создание фона и эмиттера частиц
В методе create мы размещаем игровые объекты. Сначала статический фон, а затем — систему частиц.
create ()
{
this.add.image(400, 300, 'bg');
this.add.particles(0, 100, 'rain', {
x: { min: 100, max: 640 },
quantity: 2,
lifespan: 2500,
gravityY: 200
});
}
Вызов this.add.particles создает менеджер частиц (Particle Emitter). Первые два аргумента (0, 100) — это начальные координаты `xиyдля эмиттера. Однако, как мы увидим, координатаx` каждой новой частицы будет случайной.
Настройка поведения частиц: ключевые параметры
Четвертый аргумент this.add.particles — это конфигурационный объект, определяющий поведение системы. Давайте разберем его свойства.
{
x: { min: 100, max: 640 },
quantity: 2,
lifespan: 2500,
gravityY: 200
}
1. x: { min: 100, max: 640 } — Это самый важный параметр в данном примере. Вместо фиксированной координаты, мы задаем диапазон. Каждая новая частица будет появляться в случайной точке по горизонтали между 100 и 640 пикселями. Это создает эффект дождя, идущего по всей ширине экрана, а не из одной точки.
2. quantity: 2 — Количество частиц, которые эмиттер испускает за один цикл. При старте сцены и далее с интервалом, основанном на частоте кадров, будут рождаться по 2 капли.
3. lifespan: 2500 — Время жизни частицы в миллисекундах. Через 2500 мс (2.5 секунды) капля автоматически уничтожится.
4. gravityY: 200 — Симуляция гравитации. Частица будет постоянно ускоряться вниз по оси Y со скоростью 200 пикселей в секунду за секунду, создавая реалистичное падение.
Конфигурация игры
Объект config определяет основные параметры всего игрового экземпляра Phaser.Game.
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000',
parent: 'phaser-example',
scene: Example
};
- type: Phaser.AUTO автоматически выбирает рендерер (WebGL или Canvas).
- width/height: Устанавливают размер игрового поля.
- backgroundColor: Цвет фона, который виден до загрузки или если фон не покрывает весь холст.
- parent: ID HTML-элемента, в который будет встроен игровой canvas.
- scene: Класс, который будет использован как начальная сцена. В данном случае это наш Example.
Инициализация игры происходит строкой:
const game = new Phaser.Game(config);
Что попробовать дальше
Мы создали базовую, но полноценную систему частиц, имитирующую дождь. Главный прием — использование диапазона { min, max } для свойства `x, что делает эмиттер широким и натуралистичным. Для экспериментов попробуйте: изменитьgravityYна отрицательное значение, чтобы создать восходящий поток (огонь, пузыри); добавить свойствоscaleдля изменения размера капель; или применитьvelocityY` для задания постоянной, а не ускоряющейся скорости.
