UNPKG

tsparticles

Version:

Easily create highly customizable particle animations and use them as animated backgrounds for your website. Ready to use components available also for React, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Riot.js, Inferno.

113 lines (112 loc) 4 kB
import { AbsorberInstance } from "./AbsorberInstance"; import { Utils } from "../../Utils"; import { Absorber } from "./Options/Classes/Absorber"; import { AbsorberClickMode } from "./Enums"; export class Absorbers { constructor(container) { this.container = container; this.array = []; this.absorbers = []; this.interactivityAbsorbers = []; const overridableContainer = container; overridableContainer.addAbsorber = (options, position) => this.addAbsorber(options, position); } init(options) { var _a, _b; if (!options) { return; } if (options.absorbers) { if (options.absorbers instanceof Array) { this.absorbers = options.absorbers.map((s) => { const tmp = new Absorber(); tmp.load(s); return tmp; }); } else { if (this.absorbers instanceof Array) { this.absorbers = new Absorber(); } this.absorbers.load(options.absorbers); } } const interactivityAbsorbers = (_b = (_a = options.interactivity) === null || _a === void 0 ? void 0 : _a.modes) === null || _b === void 0 ? void 0 : _b.absorbers; if (interactivityAbsorbers) { if (interactivityAbsorbers instanceof Array) { this.interactivityAbsorbers = interactivityAbsorbers.map((s) => { const tmp = new Absorber(); tmp.load(s); return tmp; }); } else { if (this.interactivityAbsorbers instanceof Array) { this.interactivityAbsorbers = new Absorber(); } this.interactivityAbsorbers.load(interactivityAbsorbers); } } if (this.absorbers instanceof Array) { for (const absorberOptions of this.absorbers) { this.addAbsorber(absorberOptions); } } else { this.addAbsorber(this.absorbers); } } particleUpdate(particle) { for (const absorber of this.array) { absorber.attract(particle); if (particle.destroyed) { break; } } } draw(context) { for (const absorber of this.array) { context.save(); absorber.draw(context); context.restore(); } } stop() { this.array = []; } resize() { for (const absorber of this.array) { absorber.resize(); } } handleClickMode(mode) { const container = this.container; const absorberOptions = this.absorbers; const modeAbsorbers = this.interactivityAbsorbers; if (mode === AbsorberClickMode.absorber) { let absorbersModeOptions; if (modeAbsorbers instanceof Array) { if (modeAbsorbers.length > 0) { absorbersModeOptions = Utils.itemFromArray(modeAbsorbers); } } else { absorbersModeOptions = modeAbsorbers; } const absorbersOptions = absorbersModeOptions !== null && absorbersModeOptions !== void 0 ? absorbersModeOptions : (absorberOptions instanceof Array ? Utils.itemFromArray(absorberOptions) : absorberOptions); const aPosition = container.interactivity.mouse.clickPosition; this.addAbsorber(absorbersOptions, aPosition); } } addAbsorber(options, position) { const absorber = new AbsorberInstance(this, this.container, options, position); this.array.push(absorber); return absorber; } removeAbsorber(absorber) { const index = this.array.indexOf(absorber); if (index >= 0) { this.array.splice(index, 1); } } }