diff --git a/main.js b/main.js index d55e102..f767489 100644 --- a/main.js +++ b/main.js @@ -1,45 +1,26 @@ - -function drawCross(ctx, hue) { - ctx.beginPath(); - ctx.moveTo(200, 200); - ctx.lineTo(300, 300); - ctx.moveTo(300, 200); - ctx.lineTo(200, 300); - ctx.lineWidth = 5; - ctx.strokeStyle = `hsla(${hue}, 100%, 50%, 1)`; - ctx.stroke(); -} - -function drawCircle(ctx) { - ctx.beginPath(); - // arc(x, y, radius, startAngle, endAngle) - ctx.arc(75, 75, 50, 0, Math.PI * 2); - ctx.stroke(); -} - let startTime = undefined; let shapes = []; let pendingClicks = []; -function animate(ctx, time) { - if (!startTime) { +function update(ctx, time) { + if (!startTime) { startTime = time; } - - for (const evt of pendingClicks) { - const h = Math.floor(Math.random() * 255); - if (evt.kind == "circle") { - shapes.push({kind: evt.kind, x: evt.x, y: evt.y, t: time, hue: h}); - } else if (evt.kind == "cross") { - shapes.push({kind: evt.kind, x: evt.x, y: evt.y, t: time, hue: h}); - } - } - pendingClicks = []; - - ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); - for (const shape of shapes) { - const dt = time - shape.t; + + for (const evt of pendingClicks) { + const h = Math.floor(Math.random() * 255); + if (evt.kind == "circle") { + shapes.push({kind: evt.kind, x: evt.x, y: evt.y, t: time, hue: h}); + } else if (evt.kind == "cross") { + shapes.push({kind: evt.kind, x: evt.x, y: evt.y, t: time, hue: h}); + } + } + pendingClicks = []; + + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + for (const shape of shapes) { + const dt = time - shape.t; switch (shape.kind) { case "circle": drawAnimatedCircle(ctx, dt, shape.x, shape.y, shape.hue); @@ -48,19 +29,19 @@ function animate(ctx, time) { drawAnimatedCross(ctx, dt, shape.x, shape.y, shape.hue); break; } - } - - window.requestAnimationFrame(time => animate(ctx, time)); + } + + window.requestAnimationFrame(time => update(ctx, time)); } function drawAnimatedCircle(ctx, dt, x, y, hue) { - const end = dt*2*Math.PI/500; - ctx.save(); + const end = dt*2*Math.PI/500; + ctx.save(); ctx.beginPath(); ctx.arc(x, y, 50, 0, Math.min(end, 2*Math.PI)); - const percent = Math.trunc(100*Math.min(end, 2*Math.PI)/(2*Math.PI)); - ctx.strokeStyle = `hsla(${hue}, ${percent}%, 50%, 1)`; - ctx.lineWidth = 5; + const percent = Math.trunc(100*Math.min(end, 2*Math.PI)/(2*Math.PI)); + ctx.strokeStyle = `hsla(${hue}, ${percent}%, 50%, 1)`; + ctx.lineWidth = 5; ctx.stroke(); ctx.restore(); } @@ -82,36 +63,36 @@ function drawAnimatedCross(ctx, dt, x, y, hue) { } ctx.lineWidth = 5; - const percent = Math.trunc(100*Math.min(delta, 100)/100); - ctx.strokeStyle = `hsla(${hue}, ${percent}%, 50%, 1)`; + const percent = Math.trunc(100*Math.min(delta, 100)/100); + ctx.strokeStyle = `hsla(${hue}, ${percent}%, 50%, 1)`; ctx.stroke(); } function resizeCanvas(ctx) { - ctx.canvas.width = window.innerWidth; - ctx.canvas.height = window.innerHeight; + ctx.canvas.width = window.innerWidth; + ctx.canvas.height = window.innerHeight; } function init() { const canvas = document.getElementById("canvas"); - if (canvas.getContext) { - const ctx = canvas.getContext("2d"); - resizeCanvas(ctx); // Init canvas - - window.addEventListener('resize', () => resizeCanvas(ctx)); - window.requestAnimationFrame(time => animate(ctx, time)) - - canvas.addEventListener("click", (evt) => { - const {clientX, clientY} = evt; - pendingClicks.push({x: clientX, y: clientY, kind: "circle"}); - }); - - canvas.addEventListener("contextmenu", (evt) => { - evt.preventDefault(); - const {clientX, clientY} = evt; - pendingClicks.push({x: clientX, y: clientY, kind: "cross"}); - }); - } + if (canvas.getContext) { + const ctx = canvas.getContext("2d"); + resizeCanvas(ctx); // Init canvas + + canvas.addEventListener("click", (evt) => { + const {clientX, clientY} = evt; + pendingClicks.push({x: clientX, y: clientY, kind: "circle"}); + }); + + canvas.addEventListener("contextmenu", (evt) => { + evt.preventDefault(); + const {clientX, clientY} = evt; + pendingClicks.push({x: clientX, y: clientY, kind: "cross"}); + }); + + window.addEventListener('resize', () => resizeCanvas(ctx)); + window.requestAnimationFrame(time => update(ctx, time)) + } } init();