250 lines
6.7 KiB
JavaScript
250 lines
6.7 KiB
JavaScript
// hexagons will be used as a separate theme later
|
|
|
|
function changeLoadingTip() {
|
|
const tips = ["Press CTRL+C to cloak your current tab","Press CTRL+M to mask your current tab", "Press CTRL+B to go back to the home page", "Join our discord server!", "Make sure to enable popups for automatic cloak", "Why are you here?"]
|
|
const element = document.getElementsByClassName("loading-tip")[0];
|
|
|
|
element.textContent = "Loading... \n" + tips[Math.floor(Math.random() * tips.length)];
|
|
}
|
|
|
|
changeLoadingTip();
|
|
$("#everything-else").hide();
|
|
|
|
let changeTip = setInterval(() => {
|
|
changeLoadingTip();
|
|
}, 3000);
|
|
|
|
$(window).on("load", () => {
|
|
$(".track").attr("stroke", "url(#grad2)");
|
|
$(".worm1").hide();
|
|
$(".worm2").hide();
|
|
clearInterval(changeTip);
|
|
|
|
$(".loading").fadeOut({
|
|
duration: 300,
|
|
complete: () => {
|
|
setTimeout(() => {
|
|
$("#everything-else").fadeIn({
|
|
duration: 500,
|
|
easing: "swing"
|
|
}, 200);
|
|
hexagonGrid();
|
|
}, 100);
|
|
}
|
|
});
|
|
});
|
|
|
|
// PARTICLES
|
|
const cvs = document.getElementsByClassName('particles')[0];
|
|
const ctx = cvs.getContext('2d');
|
|
|
|
cvs.width = window.innerWidth;
|
|
cvs.height = window.innerHeight;
|
|
|
|
let particlesArray;
|
|
|
|
let mouse = {
|
|
x: null,
|
|
y: null,
|
|
radius: 170
|
|
}
|
|
|
|
window.addEventListener('mousemove', function(event) {
|
|
mouse.x = event.x;
|
|
mouse.y = event.y;
|
|
mouse.radius = 170;
|
|
});
|
|
|
|
document.onmousemove = (function(_) {
|
|
var onmousestop = function() {
|
|
mouse.radius = 0;
|
|
}, thread;
|
|
|
|
return function() {
|
|
clearTimeout(thread);
|
|
thread = setTimeout(onmousestop, 10);
|
|
};
|
|
})();
|
|
|
|
|
|
class Particle {
|
|
constructor(x, y, directionX, directionY, size, color) {
|
|
this.x = x;
|
|
this.y = y;
|
|
this.directionX = directionX;
|
|
this.directionY = directionY;
|
|
this.size = size;
|
|
this.color = color;
|
|
}
|
|
|
|
draw() {
|
|
ctx.beginPath();
|
|
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2, false);
|
|
ctx.fillStyle = '#a3f6fd';
|
|
ctx.fill();
|
|
}
|
|
|
|
update() {
|
|
if (this.x > cvs.width || this.x < 0) {
|
|
this.directionX = -this.directionX;
|
|
}
|
|
|
|
if (this.y > cvs.height || this.y < 0) {
|
|
this.directionY = -this.directionY;
|
|
}
|
|
|
|
let dx = mouse.x - this.x;
|
|
let dy = mouse.y - this.y;
|
|
let distance = Math.sqrt(dx * dx + dy * dy);
|
|
if (distance < mouse.radius + this.size) {
|
|
if (mouse.x < this.x && this.x < cvs.width - this.size * 10) {
|
|
this.x += 10;
|
|
}
|
|
|
|
if (mouse.x > this.x && this.x > this.size * 10) {
|
|
this.x -= 10;
|
|
}
|
|
|
|
if (mouse.y < this.y && this.y < cvs.height - this.size * 10) {
|
|
this.y += 10;
|
|
}
|
|
|
|
if (mouse.y > this.y && this.y > this.size * 10) {
|
|
this.y -= 10;
|
|
}
|
|
}
|
|
this.x += this.directionX;
|
|
this.y += this.directionY;
|
|
|
|
this.draw();
|
|
}
|
|
}
|
|
|
|
function init() {
|
|
particlesArray = [];
|
|
let numberOfParticles = (cvs.height * cvs.width) / 9000;
|
|
for (let i = 0; i < numberOfParticles * 0.25; i++) {
|
|
let size = (Math.random() * 35) + 1;
|
|
let x = (Math.random() * ((innerWidth - size * 2) - (size * 2)) + size * 2);
|
|
let y = (Math.random() * ((innerWidth - size * 2) - (size * 2)) + size * 2);
|
|
let directionX = (Math.random() * 5) - 2.5;
|
|
let directionY = (Math.random() * 5) - 2.5;
|
|
let color = '#a3f6fd';
|
|
particlesArray.push(new Particle(x, y, directionX, directionY, size, color));
|
|
}
|
|
}
|
|
|
|
function connect() {
|
|
let opacityValue = 1;
|
|
for (let i = 0; i < particlesArray.length; i++) {
|
|
for (let j = i; j < particlesArray.length; j++) {
|
|
let distance = ((particlesArray[i].x - particlesArray[j].x) * (particlesArray[i].x - particlesArray[j].x)) + ((particlesArray[i].y - particlesArray[j].y) * (particlesArray[i].y - particlesArray[j].y));
|
|
|
|
if (distance < (cvs.width/ 7) * (cvs.height / 7)) {
|
|
opacityValue = 1 - (distance / 20000);
|
|
ctx.strokeStyle = 'rgba(159, 253, 50,' + opacityValue + ')';
|
|
ctx.lineWidth = 1;
|
|
ctx.beginPath();
|
|
ctx.moveTo(particlesArray[i].x, particlesArray[i].y);
|
|
ctx.lineTo(particlesArray[j].x, particlesArray[j].y);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function animate() {
|
|
requestAnimationFrame(animate);
|
|
ctx.clearRect(0, 0, innerWidth, innerHeight);
|
|
for (let i = 0; i < particlesArray.length; i++) {
|
|
particlesArray[i].update();
|
|
}
|
|
connect();
|
|
}
|
|
|
|
window.addEventListener('resize', function() {
|
|
cvs.width = innerWidth;
|
|
cvs.height = this.innerHeight;
|
|
mouse.radius = 170;
|
|
init();
|
|
});
|
|
|
|
window.addEventListener('mouseout', function() {
|
|
mouse.x = undefined;
|
|
mouse.y = undefined;
|
|
});
|
|
|
|
init();
|
|
animate();
|
|
|
|
// HEXAGON GRID
|
|
function hexagonGrid() {
|
|
const HEXAGON_GRID = document.getElementsByClassName("hexagonGrid")[0];
|
|
const CONTAINER = HEXAGON_GRID.parentNode;
|
|
|
|
let wall = {
|
|
width: CONTAINER.offsetWidth,
|
|
height: CONTAINER.offsetHeight
|
|
};
|
|
|
|
let rowsNumber = Math.ceil(wall.height / 80);
|
|
let columnsNumber = Math.ceil(wall.width / 100) + 1;
|
|
|
|
HEXAGON_GRID.innerHTML = "";
|
|
|
|
for (let i = 0; i < rowsNumber; i++) {
|
|
let row = document.createElement("div");
|
|
row.className = "row";
|
|
HEXAGON_GRID.appendChild(row);
|
|
}
|
|
|
|
let rows = HEXAGON_GRID.querySelectorAll(".row");
|
|
|
|
for (let i = 0; i < rows.length; i++) {
|
|
for (let j = 0; j < columnsNumber; j++) {
|
|
let hexagon = document.createElement("div");
|
|
hexagon.className = "hexagon";
|
|
rows[i].appendChild(hexagon);
|
|
}
|
|
}
|
|
}
|
|
|
|
hexagonGrid();
|
|
|
|
window.addEventListener('resize', function() {
|
|
hexagonGrid();
|
|
});
|
|
|
|
// FPS METER
|
|
(function () {
|
|
let previousTime = Date.now();
|
|
let frames = 0;
|
|
let refreshRate = 1000;
|
|
|
|
let fpsMeter = document.createElement("div");
|
|
fpsMeter.id = "fpsMeter";
|
|
document.body.appendChild(fpsMeter);
|
|
|
|
requestAnimationFrame(function loop() {
|
|
const TIME = Date.now();
|
|
frames++;
|
|
if (TIME > previousTime + refreshRate) {
|
|
let fps = Math.round((frames * refreshRate) / (TIME - previousTime));
|
|
previousTime = TIME;
|
|
frames = 0;
|
|
fpsMeter.innerHTML = "FPS: " + fps * (1000 / refreshRate);
|
|
}
|
|
requestAnimationFrame(loop);
|
|
});
|
|
|
|
fpsMeter.style.position = "fixed";
|
|
fpsMeter.style.top = "25px";
|
|
fpsMeter.style.right = "25px";
|
|
fpsMeter.style.background = "rgba(0, 0, 0, 0.5)";
|
|
fpsMeter.style.padding = "10px";
|
|
fpsMeter.style.color = "rgba(255, 255, 255, 0.75)";
|
|
fpsMeter.style.fontFamily = "Monospace";
|
|
fpsMeter.style.fontSize = "24px";
|
|
fpsMeter.style.zIndex = "10000";
|
|
})();
|