О чем этот пример
Когда частицы накладываются друг на друга, порядок их отрисовки определяет итоговый визуальный эффект. По умолчанию Phaser отрисовывает частицы в порядке их создания, что не всегда подходит для сложных систем. Управляя свойством `sortProperty`, вы можете изменить этот порядок на основе координат частицы, создавая более предсказуемые и визуально приятные композиции. В этой статье мы разберем пример, где частицы сортируются по оси X, и посмотрим, как инвертировать порядок сортировки в реальном времени. Этот прием полезен для создания эффектов глубины, дыма, волн или любых систем, где важен визуальный приоритет объектов.
Версия 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.atlas('blocks', 'assets/sprites/blocks.png', 'assets/sprites/blocks.json');
}
create ()
{
const emitter = this.add.particles(100, 300, 'blocks', {
frame: 'redmonster',
lifespan: 5000,
angle: { min: -20, max: 20 },
speed: 150,
frequency: 200
});
emitter.sortProperty = 'x';
emitter.sortOrderAsc = true;
const text = this.add.text(10, 10, 'Click to change. sortOrderAsc: true');
this.input.on('pointerdown', () => {
if (emitter.sortOrderAsc)
{
emitter.sortOrderAsc = false;
}
else
{
emitter.sortOrderAsc = true;
}
text.setText(`Click to change. sortOrderAsc: ${emitter.sortOrderAsc}`);
});
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Настройка эмиттера частиц
В методе create создается эмиттер частиц с базовой конфигурацией. Частицы используют спрайт из атласа blocks с конкретным кадром redmonster. Важные параметры: lifespan (время жизни), angle (разброс направления), speed и frequency (частота появления).
Эмиттер размещается в точке (100, 300), и частицы будут лететь вверх с небольшим случайным отклонением.
const emitter = this.add.particles(100, 300, 'blocks', {
frame: 'redmonster',
lifespan: 5000,
angle: { min: -20, max: 20 },
speed: 150,
frequency: 200
});
Сортировка частиц по свойству
Ключевой момент — это настройка сортировки. Свойство emitter.sortProperty определяет, по какому параметру частицы будут упорядочиваться перед отрисовкой. В примере установлено значение 'x', что означает сортировку по горизонтальной координате.
Свойство emitter.sortOrderAsc задает направление сортировки. Значение true — по возрастанию (от меньшего X к большему), false — по убыванию. Это влияет на то, какие частицы будут отрисованы поверх других.
emitter.sortProperty = 'x';
emitter.sortOrderAsc = true;
Динамическое переключение порядка
В примере добавлена интерактивность: по клику мыши порядок сортировки инвертируется. Обработчик события pointerdown проверяет текущее значение sortOrderAsc и меняет его на противоположное.
Текстовый объект text обновляется, чтобы отображать текущее состояние. Это позволяет наглядно увидеть разницу в визуальном слое частиц.
this.input.on('pointerdown', () => {
if (emitter.sortOrderAsc) {
emitter.sortOrderAsc = false;
} else {
emitter.sortOrderAsc = true;
}
text.setText(`Click to change. sortOrderAsc: ${emitter.sortOrderAsc}`);
});
Визуальный результат и практическое применение
При sortOrderAsc: true частицы с меньшей координатой X (левее) рисуются первыми, а с большей X (правее) — поверх них. При false — наоборот. Это создает эффект «слоев».
Сортировка работает в реальном времени для всех живых частиц. Это полезно для: * **Эффектов глубины:** Частицы «ближе» к камере (условно справа) могут перекрывать «дальние». * **Упорядоченных систем:** Например, дым, который должен подниматься упорядоченными столбами. * **Оптимизации восприятия:** Контроль за тем, какие элементы визуально выделяются.
Важно: сортировка влияет только на отрисовку, но не на физику или взаимодействие частиц.
Что попробовать дальше
Управление sortProperty и sortOrderAsc у эмиттера частиц — это простой, но мощный инструмент для контроля визуальной иерархии в ваших эффектах. Вы можете экспериментировать, сортируя частицы по другим свойствам, например `y(для вертикальных слоев) илиalpha(для прозрачности). Попробуйте комбинировать это с изменениемdepth` у самих частиц или создать несколько эмиттеров с разной сортировкой для сложных композиций.
