Библиотека pixi-particles расширяет возможности PixiJS, предоставляя гибкий инструмент для создания визуально сложных частиц и эффектов. Она построена на основе ParticleContainer, что обеспечивает высокую производительность при отображении тысяч частиц одновременно.
Для работы с pixi-particles требуется наличие PixiJS версии 5 и выше. Библиотека может быть подключена через npm:
npm install pixi.js pixi-particles
Импорт в проект на ES6:
import * as PIXI from 'pixi.js';
import { Emitter } from 'pixi-particles';
Основной объект для управления частицами — Emitter. Он принимает контейнер, в котором будут рендериться частицы, текстуры и настройки конфигурации:
const app = new PIXI.Application({ width: 800, height: 600 });
document.body.appendChild(app.view);
const particleContainer = new PIXI.Container();
app.stage.addChild(particleContainer);
const emitterConfig = {
alpha: {
start: 1,
end: 0
},
scale: {
start: 0.5,
end: 1
},
color: {
start: "ffffff",
end: "ff0000"
},
speed: {
start: 200,
end: 50
},
startRotation: {
min: 0,
max: 360
},
rotationSpeed: {
min: 0,
max: 200
},
lifetime: {
min: 0.5,
max: 2
},
frequency: 0.008,
emitterLifetime: -1,
maxParticles: 1000,
pos: {
x: 400,
y: 300
},
addAtBack: false,
spawnType: "point"
};
const textures = [PIXI.Texture.from('particle.png')];
const emitter = new Emitter(particleContainer, textures, emitterConfig);
pixi-particles не обновляет частицы автоматически.
Для этого необходимо вызывать метод update(delta) внутри
игрового цикла:
let elapsed = Date.now();
app.ticker.add(() => {
const now = Date.now();
const delta = (now - elapsed) * 0.001;
emitter.update(delta);
elapsed = now;
});
delta — это время в секундах, прошедшее с последнего
кадра, что обеспечивает корректное движение частиц при любых FPS.
Конфигурационный объект предоставляет детальный контроль над поведением частиц:
Эти параметры можно динамически изменять во время работы приложения, позволяя создавать интерактивные эффекты.
pixi-particles поддерживает несколько способов появления частиц:
Пример создания круга:
emitter.spawnType = "circle";
emitter.spawnCircle = { x: 0, y: 0, r: 50 };
Эмиттер можно останавливать и запускать повторно:
emitter.emit = true; // запуск
emitter.emit = false; // остановка генерации новых частиц
// полное уничтожение после завершения жизни всех частиц
emitter.cleanup();
Для сложных сцен с тысячами частиц:
tint.maxParticles и frequency,
чтобы избежать перегрузки GPU.Эффекты можно синхронизировать с действиями пользователя или событиями игры. Пример — всплеск частиц при клике:
app.view.addEventListener('pointerdown', (event) => {
emitter.pos.x = event.clientX;
emitter.pos.y = event.clientY;
emitter.emit = true;
setTimeout(() => {
emitter.emit = false;
}, 500);
});
Таким образом создаются динамичные эффекты, которые реагируют на интерактивные события.
Эмиттеры можно комбинировать с фильтрами (blur, glow, displacement) для создания сложных визуальных эффектов. Например, частицы можно обрабатывать через фильтр размытия для имитации дыма или магического свечения.
Эта интеграция позволяет создавать полноценные визуальные сцены с высокой производительностью, гибкостью и минимальными затратами ресурсов.