UNPKG

tsparticles

Version:

Porting of the abandoned Vincent Garreau's particles.js, converted in TypeScript. Added many new cool features and various bug fixes.

65 lines (64 loc) 2.71 kB
import { Utils } from "../Utils/Utils"; import { HoverMode } from "../../Enums/Modes/HoverMode"; export class Mover { constructor(container, particle) { this.container = container; this.particle = particle; } move(delta) { const container = this.container; const options = container.options; const particle = this.particle; if (options.particles.move.enable) { const slowFactor = this.getProximitySpeedFactor(); const deltaFactor = options.fpsLimit > 0 ? (60 * delta) / 1000 : 3.6; const moveSpeed = container.retina.moveSpeed / 2 * slowFactor * deltaFactor; particle.position.x += particle.velocity.horizontal * moveSpeed; particle.position.y += particle.velocity.vertical * moveSpeed; } this.moveParallax(); } moveParallax() { const container = this.container; const options = container.options; if (!options.interactivity.events.onHover.parallax.enable) { return; } const particle = this.particle; const parallaxForce = options.interactivity.events.onHover.parallax.force; const mousePos = container.interactivity.mouse.position || { x: 0, y: 0 }; const windowDimension = { height: window.innerHeight / 2, width: window.innerWidth / 2, }; const parallaxSmooth = options.interactivity.events.onHover.parallax.smooth; const tmp = { x: (mousePos.x - windowDimension.width) * (particle.radius / parallaxForce), y: (mousePos.y - windowDimension.height) * (particle.radius / parallaxForce), }; particle.offset.x += (tmp.x - particle.offset.x) / parallaxSmooth; particle.offset.y += (tmp.y - particle.offset.y) / parallaxSmooth; } getProximitySpeedFactor() { const container = this.container; const options = container.options; const particle = this.particle; const active = Utils.isInArray(HoverMode.slow, options.interactivity.events.onHover.mode); if (!active) { return 1; } const mousePos = this.container.interactivity.mouse.position; if (!mousePos) { return 1; } const particlePos = particle.position; const dist = Utils.getDistanceBetweenCoordinates(mousePos, particlePos); const radius = container.retina.slowModeRadius; if (dist > radius) { return 1; } const proximityFactor = (dist / radius) || 0; const slowFactor = options.interactivity.modes.slow.factor; return proximityFactor / slowFactor; } }