2023-02-17 11:06:01 +01:00

72 lines
2.5 KiB
JavaScript

import { getValue } from "tsparticles-engine";
export function bounceHorizontal(data) {
if (data.outMode !== "bounce" &&
data.outMode !== "bounce-horizontal" &&
data.outMode !== "bounceHorizontal" &&
data.outMode !== "split") {
return;
}
if (data.bounds.right < 0) {
data.particle.position.x = data.size + data.offset.x;
}
else if (data.bounds.left > data.canvasSize.width) {
data.particle.position.x = data.canvasSize.width - data.size - data.offset.x;
}
const velocity = data.particle.velocity.x;
let bounced = false;
if ((data.direction === "right" && data.bounds.right >= data.canvasSize.width && velocity > 0) ||
(data.direction === "left" && data.bounds.left <= 0 && velocity < 0)) {
const newVelocity = getValue(data.particle.options.bounce.horizontal);
data.particle.velocity.x *= -newVelocity;
bounced = true;
}
if (!bounced) {
return;
}
const minPos = data.offset.x + data.size;
if (data.bounds.right >= data.canvasSize.width) {
data.particle.position.x = data.canvasSize.width - minPos;
}
else if (data.bounds.left <= 0) {
data.particle.position.x = minPos;
}
if (data.outMode === "split") {
data.particle.destroy();
}
}
export function bounceVertical(data) {
if (data.outMode !== "bounce" &&
data.outMode !== "bounce-vertical" &&
data.outMode !== "bounceVertical" &&
data.outMode !== "split") {
return;
}
if (data.bounds.bottom < 0) {
data.particle.position.y = data.size + data.offset.y;
}
else if (data.bounds.top > data.canvasSize.height) {
data.particle.position.y = data.canvasSize.height - data.size - data.offset.y;
}
const velocity = data.particle.velocity.y;
let bounced = false;
if ((data.direction === "bottom" && data.bounds.bottom >= data.canvasSize.height && velocity > 0) ||
(data.direction === "top" && data.bounds.top <= 0 && velocity < 0)) {
const newVelocity = getValue(data.particle.options.bounce.vertical);
data.particle.velocity.y *= -newVelocity;
bounced = true;
}
if (!bounced) {
return;
}
const minPos = data.offset.y + data.size;
if (data.bounds.bottom >= data.canvasSize.height) {
data.particle.position.y = data.canvasSize.height - minPos;
}
else if (data.bounds.top <= 0) {
data.particle.position.y = minPos;
}
if (data.outMode === "split") {
data.particle.destroy();
}
}