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.

116 lines (115 loc) 4.21 kB
import { AbsorberInstance } from "./AbsorberInstance"; import { Absorber } from "./Options/Classes/Absorber"; import { AbsorberClickMode } from "./Enums"; import { itemFromArray } from "../../Utils"; export class Absorbers { constructor(container) { this.container = container; this.array = []; this.absorbers = []; this.interactivityAbsorbers = []; const overridableContainer = container; overridableContainer.getAbsorber = (idxOrName) => idxOrName === undefined || typeof idxOrName === "number" ? this.array[idxOrName || 0] : this.array.find((t) => t.name === idxOrName); 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 = itemFromArray(modeAbsorbers); } } else { absorbersModeOptions = modeAbsorbers; } const absorbersOptions = absorbersModeOptions !== null && absorbersModeOptions !== void 0 ? absorbersModeOptions : (absorberOptions instanceof Array ? 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); } } }