2021-05-14 05:38:17 +00:00
|
|
|
var particles = {};
|
2021-05-14 01:40:51 +00:00
|
|
|
var particleID = 0;
|
|
|
|
var mouseX = 0;
|
|
|
|
var mouseY = 0;
|
|
|
|
|
|
|
|
function makeParticles(data, amount=1) {
|
|
|
|
for (let x = 0; x < amount; x++) {
|
|
|
|
let particle = getNewParticle()
|
|
|
|
for (thing in data) {
|
2021-05-14 05:38:17 +00:00
|
|
|
|
2021-05-14 01:40:51 +00:00
|
|
|
switch(thing) {
|
2021-05-14 06:17:12 +00:00
|
|
|
case 'onClick': // Functions that should be copied over
|
2021-05-14 19:53:48 +00:00
|
|
|
case 'onMouseEnter':
|
|
|
|
case 'onMouseLeave':
|
2021-05-14 06:17:12 +00:00
|
|
|
case 'update':
|
2021-05-14 05:38:17 +00:00
|
|
|
particle[thing] = data[thing]
|
2021-05-14 06:17:12 +00:00
|
|
|
break;
|
2021-05-14 05:38:17 +00:00
|
|
|
default:
|
|
|
|
particle[thing]=run(data[thing], data, x)
|
2021-05-14 01:40:51 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2021-05-14 05:38:17 +00:00
|
|
|
if (data.angle === undefined) {
|
|
|
|
particle.dir = particle.angle
|
|
|
|
}
|
|
|
|
particle.dir = particle.dir + (particle.spread * (x- amount/2 + 0.5))
|
|
|
|
|
2021-05-14 06:17:12 +00:00
|
|
|
particle.x += particle.offset * sin(particle.dir)
|
|
|
|
particle.y += particle.offset * cos(particle.dir) * -1
|
|
|
|
|
2021-05-14 05:38:17 +00:00
|
|
|
particle.xVel = particle.speed * sin(particle.dir)
|
|
|
|
particle.yVel = particle.speed * cos(particle.dir) * -1
|
2021-05-15 01:51:49 +00:00
|
|
|
particle.fadeInTimer = particle.fadeInTime
|
2021-05-14 05:38:17 +00:00
|
|
|
Vue.set(particles, particle.id, particle)
|
|
|
|
|
2021-05-14 01:40:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-14 05:38:17 +00:00
|
|
|
function sin(x) {
|
|
|
|
return Math.sin(x*Math.PI/180)
|
|
|
|
}
|
|
|
|
|
|
|
|
function cos(x) {
|
|
|
|
return Math.cos(x*Math.PI/180)
|
|
|
|
}
|
2021-05-14 01:40:51 +00:00
|
|
|
|
|
|
|
function updateParticles(diff) {
|
|
|
|
for (p in particles) {
|
2021-05-14 06:17:12 +00:00
|
|
|
let particle = particles[p]
|
|
|
|
particle.time -= diff;
|
2021-05-15 01:51:49 +00:00
|
|
|
particle.fadeInTimer -= diff;
|
2021-05-14 06:17:12 +00:00
|
|
|
if (particle["time"] < 0) {
|
2021-05-14 05:38:17 +00:00
|
|
|
Vue.delete(particles, p);
|
|
|
|
|
2021-05-14 01:40:51 +00:00
|
|
|
}
|
2021-05-14 05:38:17 +00:00
|
|
|
else {
|
2021-05-14 06:17:12 +00:00
|
|
|
if (particle.update) run(particle.update, particle)
|
|
|
|
particle.angle += particle.rotation
|
|
|
|
particle.x += particle.xVel
|
|
|
|
particle.y += particle.yVel
|
|
|
|
particle.yVel += particle.gravity
|
|
|
|
|
2021-05-14 05:38:17 +00:00
|
|
|
}
|
2021-05-14 01:40:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getNewParticle() {
|
|
|
|
particleID++
|
|
|
|
return {
|
2021-05-15 03:50:39 +00:00
|
|
|
time: 3,
|
2021-05-14 01:40:51 +00:00
|
|
|
id: particleID,
|
|
|
|
x: mouseX,
|
|
|
|
y: mouseY,
|
2021-05-14 05:38:17 +00:00
|
|
|
width: 35,
|
|
|
|
height: 35,
|
|
|
|
image: "resources/genericParticle.png",
|
|
|
|
angle: 0,
|
|
|
|
spread: 30,
|
2021-05-14 06:17:12 +00:00
|
|
|
offset: 10,
|
|
|
|
speed: 15,
|
2021-05-14 05:38:17 +00:00
|
|
|
xVel: 0,
|
|
|
|
yVel: 0,
|
|
|
|
rotation: 0,
|
2021-05-14 06:17:12 +00:00
|
|
|
gravity: 0,
|
|
|
|
fadeTime: 1,
|
2021-05-15 01:51:49 +00:00
|
|
|
fadeInTimer: 0,
|
|
|
|
fadeIn: 0,
|
2021-05-14 01:40:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateMouse(event) {
|
|
|
|
mouseX = event.clientX
|
|
|
|
mouseY = event.clientY
|
2021-05-14 05:38:17 +00:00
|
|
|
}
|
|
|
|
|
2021-05-15 01:51:49 +00:00
|
|
|
function getOpacity(particle) {
|
|
|
|
if ((particle.time < particle.fadeTime) && particle.fadeTime)
|
|
|
|
return particle.time / particle.fadeTime
|
|
|
|
if (particle.fadeInTimer > 0)
|
|
|
|
return 1 - (particle.fadeInTimer / particle.fadeInTime)
|
|
|
|
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2021-05-14 05:38:17 +00:00
|
|
|
function constructParticleStyle(particle){
|
|
|
|
return {
|
|
|
|
left: (particle.x - particle.height/2) + 'px',
|
|
|
|
top: (particle.y - particle.height/2) + 'px',
|
|
|
|
width: particle.width + 'px',
|
|
|
|
height: particle.height + 'px',
|
|
|
|
transform: "rotate(" + particle.angle + "deg)",
|
2021-05-15 01:51:49 +00:00
|
|
|
opacity: getOpacity(particle),
|
2021-05-14 06:17:12 +00:00
|
|
|
"pointer-events": (particle.onClick || particle.onHover) ? 'auto' : 'none',
|
2021-05-15 01:51:49 +00:00
|
|
|
"background-image": "url(" + particle.image + ")",
|
2021-05-14 05:38:17 +00:00
|
|
|
}
|
2021-05-14 06:43:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function clearParticles(check) {
|
2021-05-15 01:51:49 +00:00
|
|
|
if (!check) check = true
|
2021-05-14 06:43:43 +00:00
|
|
|
|
|
|
|
for (p in particles) {
|
|
|
|
if (run(check, particles[p], particles[p])){
|
|
|
|
Vue.delete(particles, p)
|
|
|
|
}
|
|
|
|
}
|
2021-05-14 01:40:51 +00:00
|
|
|
}
|