О чем этот пример
Эффект размытия боке часто ассоциируется с красивым расфокусированным фоном в фотографии, но в играх он может придать особую глубину и атмосферу визуальным эффектам, таким как частицы. В этом руководстве мы разберём, как применить фильтр боке к эмиттеру частиц в 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('star', 'assets/demoscene/star3.png');
this.load.image('touhou', 'assets/pics/touhou1.png');
}
create ()
{
const emitter = this.add.particles(400, 200, 'star', {
angle: { min: 240, max: 300 },
speed: { min: 200, max: 300 },
lifespan: 4000,
gravityY: 180,
quantity: 2,
bounce: 0.4,
bounds: new Phaser.Geom.Rectangle(-100, -200, 1000, 750)
});
emitter.particleBringToTop = false;
emitter.enableFilters();
emitter.filters.external.addBokeh(0.5, 10, 0.2);
this.add.image(650, 600, 'touhou').setOrigin(0.5, 1);
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000022',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Загрузка ресурсов и настройка сцены
Вся работа начинается в методе preload(). Мы загружаем два изображения: одно для частиц (star), а второе (touhou) — как статичный фон для демонстрации глубины эффекта. Важно отметить, что пример использует метод setBaseURL, чтобы не указывать полный путь к каждому файлу.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('star', 'assets/demoscene/star3.png');
this.load.image('touhou', 'assets/pics/touhou1.png');
}
Конфигурация игры задаёт базовые параметры, такие как размер холста и цвет фона. Цвет фона #000022 выбран тёмно-синим, чтобы контрастировать со светящимися частицами.
Создание и настройка эмиттера частиц
В методе create() создаётся система частиц. Эмиттер размещается в точке (400, 200) и использует текстуру star. Ключевые параметры настраивают поведение частиц:
- angle и speed: определяют направление и разброс скорости разлёта.
- lifespan: время жизни частицы в миллисекундах.
- gravityY: сила гравитации, притягивающая частицы вниз.
- bounds: прямоугольная область, ограничивающая движение частиц.
- bounce: коэффициент отскока от границ.
const emitter = this.add.particles(400, 200, 'star', {
angle: { min: 240, max: 300 },
speed: { min: 200, max: 300 },
lifespan: 4000,
gravityY: 180,
quantity: 2,
bounce: 0.4,
bounds: new Phaser.Geom.Rectangle(-100, -200, 1000, 750)
});
Строка emitter.particleBringToTop = false; указывает, что новые частицы не должны перемещаться поверх старых. Это важно для корректного наложения фильтров.
Включение и применение фильтра боке
Фильтры в Phaser для систем частиц не активны по умолчанию. Чтобы их использовать, нужно сначала вызвать метод enableFilters() для эмиттера. Это подготавливает систему к применению пост-обработки.
emitter.enableFilters();
После этого мы можем обратиться к коллекции фильтров эмиттера emitter.filters.external и добавить фильтр боке с помощью метода addBokeh. Этот метод принимает три основных параметра:
1. Размер (или радиус) размытия.
2. Качество (количество итераций или проходов). Более высокое значение даёт более гладкий эффект, но требует больше вычислений.
3. Яркость свечения размытых областей.
emitter.filters.external.addBokeh(0.5, 10, 0.2);
Фильтр применяется ко всем частицам эмиттера, создавая эффект мягкого свечения и размытия, имитирующий глубину резкости.
Добавление фонового изображения
Для завершения композиции и усиления ощущения глубины на сцену добавляется статичное изображение. Оно размещается в нижней части экрана и служит точкой фокуса, на фоне которой особенно заметен эффект боке от частиц.
this.add.image(650, 600, 'touhou').setOrigin(0.5, 1);
Метод setOrigin(0.5, 1) устанавливает точку привязки изображения по центру по горизонтали и по нижнему краю по вертикали. Это позволяет удобно позиционировать картинку у нижней границы экрана.
Что попробовать дальше
Фильтр боке — мощный инструмент для быстрого добавления атмосферы и реалистичности частицам в Phaser. Он превращает обычные спрайты в светящиеся, размытые элементы, создавая иллюзию глубины и расфокусировки. Для экспериментов попробуйте изменить параметры addBokeh: увеличьте радиус для более сильного размытия, поиграйте с яркостью для создания эффекта бликов или примените фильтр к нескольким эмиттерам с разными настройками для сложных визуальных композиций.
