120 lines
4.3 KiB
JavaScript
120 lines
4.3 KiB
JavaScript
import { arrayRandomIndex, executeOnSingleOrMultiple, itemFromArray } from "tsparticles-engine";
|
|
import { Emitter } from "./Options/Classes/Emitter";
|
|
import { EmitterInstance } from "./EmitterInstance";
|
|
export class Emitters {
|
|
constructor(engine, container) {
|
|
this.container = container;
|
|
this._engine = engine;
|
|
this.array = [];
|
|
this.emitters = [];
|
|
this.interactivityEmitters = {
|
|
random: {
|
|
count: 1,
|
|
enable: false,
|
|
},
|
|
value: [],
|
|
};
|
|
container.getEmitter = (idxOrName) => idxOrName === undefined || typeof idxOrName === "number"
|
|
? this.array[idxOrName || 0]
|
|
: this.array.find((t) => t.name === idxOrName);
|
|
container.addEmitter = (options, position) => this.addEmitter(options, position);
|
|
container.removeEmitter = (idxOrName) => {
|
|
const emitter = container.getEmitter(idxOrName);
|
|
if (emitter) {
|
|
this.removeEmitter(emitter);
|
|
}
|
|
};
|
|
container.playEmitter = (idxOrName) => {
|
|
const emitter = container.getEmitter(idxOrName);
|
|
if (emitter) {
|
|
emitter.externalPlay();
|
|
}
|
|
};
|
|
container.pauseEmitter = (idxOrName) => {
|
|
const emitter = container.getEmitter(idxOrName);
|
|
if (emitter) {
|
|
emitter.externalPause();
|
|
}
|
|
};
|
|
}
|
|
addEmitter(options, position) {
|
|
const emitterOptions = new Emitter();
|
|
emitterOptions.load(options);
|
|
const emitter = new EmitterInstance(this._engine, this, this.container, emitterOptions, position);
|
|
this.array.push(emitter);
|
|
return emitter;
|
|
}
|
|
handleClickMode(mode) {
|
|
const emitterOptions = this.emitters, modeEmitters = this.interactivityEmitters;
|
|
if (mode === "emitter") {
|
|
let emittersModeOptions;
|
|
if (modeEmitters && modeEmitters.value instanceof Array) {
|
|
if (modeEmitters.value.length > 0 && modeEmitters.random.enable) {
|
|
emittersModeOptions = [];
|
|
const usedIndexes = [];
|
|
for (let i = 0; i < modeEmitters.random.count; i++) {
|
|
const idx = arrayRandomIndex(modeEmitters.value);
|
|
if (usedIndexes.includes(idx) && usedIndexes.length < modeEmitters.value.length) {
|
|
i--;
|
|
continue;
|
|
}
|
|
usedIndexes.push(idx);
|
|
emittersModeOptions.push(itemFromArray(modeEmitters.value, idx));
|
|
}
|
|
}
|
|
else {
|
|
emittersModeOptions = modeEmitters.value;
|
|
}
|
|
}
|
|
else {
|
|
emittersModeOptions = modeEmitters === null || modeEmitters === void 0 ? void 0 : modeEmitters.value;
|
|
}
|
|
const emittersOptions = emittersModeOptions !== null && emittersModeOptions !== void 0 ? emittersModeOptions : emitterOptions, ePosition = this.container.interactivity.mouse.clickPosition;
|
|
executeOnSingleOrMultiple(emittersOptions, (emitter) => {
|
|
this.addEmitter(emitter, ePosition);
|
|
});
|
|
}
|
|
}
|
|
async init() {
|
|
this.emitters = this.container.actualOptions.emitters;
|
|
this.interactivityEmitters = this.container.actualOptions.interactivity.modes.emitters;
|
|
if (this.emitters instanceof Array) {
|
|
for (const emitterOptions of this.emitters) {
|
|
this.addEmitter(emitterOptions);
|
|
}
|
|
}
|
|
else {
|
|
this.addEmitter(this.emitters);
|
|
}
|
|
}
|
|
pause() {
|
|
for (const emitter of this.array) {
|
|
emitter.pause();
|
|
}
|
|
}
|
|
play() {
|
|
for (const emitter of this.array) {
|
|
emitter.play();
|
|
}
|
|
}
|
|
removeEmitter(emitter) {
|
|
const index = this.array.indexOf(emitter);
|
|
if (index >= 0) {
|
|
this.array.splice(index, 1);
|
|
}
|
|
}
|
|
resize() {
|
|
for (const emitter of this.array) {
|
|
emitter.resize();
|
|
}
|
|
}
|
|
stop() {
|
|
this.array = [];
|
|
}
|
|
update(delta) {
|
|
for (const emitter of this.array) {
|
|
emitter.update(delta);
|
|
}
|
|
}
|
|
}
|