From 559865834ab0d69b3736e7fba8f7011070353304 Mon Sep 17 00:00:00 2001 From: p-wojt Date: Mon, 3 Jan 2022 22:15:48 +0100 Subject: [PATCH] rotation & try display text names --- src/app.ts | 91 +++++++++++++++++++++++------------------- static/arrow-down.png | Bin 0 -> 11894 bytes 2 files changed, 51 insertions(+), 40 deletions(-) create mode 100644 static/arrow-down.png diff --git a/src/app.ts b/src/app.ts index 3323979..2d2be18 100644 --- a/src/app.ts +++ b/src/app.ts @@ -30,6 +30,12 @@ const canvasWrapper = document.getElementsByClassName( )[0]! as HTMLDivElement; const MAXIMUM_SIZE = 16; +canvasEl.width = canvasWrapper.offsetWidth; +canvasEl.height = canvasWrapper.offsetHeight; +const x = canvasEl.width / 2; +const y = canvasEl.height / 2; +const radius = canvasEl.height / 2; +const animationFPSRate = 30; counterEl.textContent = `0/${MAXIMUM_SIZE}`; @@ -152,22 +158,23 @@ function lightDarkMode() { }); } +const arrowImage = document.createElement('img'); +arrowImage.src = 'static/arrow-down.png'; +arrowImage.alt = 'arrow'; + function drawRouletteWheel(angle: number) { - canvasEl.width = canvasWrapper.offsetWidth; - canvasEl.height = canvasWrapper.offsetHeight; - const x = canvasEl.width / 2; - const y = canvasEl.height / 2; - const radius = canvasEl.height / 2; - ctx.clearRect(0, 0, canvasEl.width, canvasEl.height); + const segmentWidth = 360 / items.length; let startAngle = angle; + let endAngle = segmentWidth + startAngle; + ctx.clearRect(0, 0, canvasEl.width, canvasEl.height); ctx.beginPath(); ctx.arc(x, y, radius, 0, Math.PI * 2, true); - ctx.stroke(); - const segmentWidth = 360 / items.length; - let endAngle = segmentWidth + startAngle; + // let xtemp = x + Math.cos(totalAngle/2) * radius/2; + // let ytemp = y + Math.sin(totalAngle/2) * radius/2; for (let i = 0; i < items.length; i++) { ctx.beginPath(); ctx.lineTo(x, y) + ctx.font = 'bold 24px verdana, sans-serif'; ctx.arc( x, y, @@ -176,52 +183,56 @@ function drawRouletteWheel(angle: number) { (endAngle * Math.PI) / 180, false ); + ctx.fillText(itemsList.items[i].name, x + Math.cos(segmentWidth * i ) * radius / 2, y + Math.sin(segmentWidth * i + angle) * radius / 2 ); ctx.lineTo(x, y) ctx.fillStyle = itemsList.items[i].color; ctx.fill(); - if (items.length !== 1) ctx.stroke(); + if (items.length !== 1) { + ctx.stroke(); + } + ctx.drawImage(arrowImage, x - 32, -32, 64, 64); startAngle += segmentWidth; endAngle += segmentWidth; + // xtemp += Math.cos(totalAngle/2) * radius/2; + // ytemp += Math.sin(totalAngle/2) * radius/2; + // console.log(ytemp); } } -let angleSpeed = 1; + let guessItemIndex = Math.floor(Math.random() * items.length); let segmentAngle = 360 / items.length; -const rotations = 10; +const rotations = 3; let maxAngle = 360 * rotations + segmentAngle * guessItemIndex; -let delta = 0.2; +let angleSpeed = 0; let totalAngle = 0; - let animationId: number | null; +let animationId: number | null; +let startAngle = 1; +// const maxAngleSpeed = segmentAngle; function startRoulette(){ if(animationId){ - resetRouletteAnimation(); + //resetRouletteAnimation(); }else{ - drawRouletteWheel(0); guessItemIndex = Math.floor(Math.random() * items.length); - segmentAngle = 360 / items.length; - console.log(itemsList.items[guessItemIndex].color); - maxAngle = 360 * rotations + segmentAngle * (guessItemIndex - 1) + segmentAngle * Math.random(); console.log(guessItemIndex); - delta = 0.2 + segmentAngle = 360 / items.length; + maxAngle = 360 * rotations + ((items.length - 1) - guessItemIndex) * segmentAngle + Math.random() * segmentAngle; beginAnimateRoulette(); } } -function beginAnimateRoulette(){; - drawRouletteWheel(angleSpeed); +function beginAnimateRoulette(){ if(totalAngle < maxAngle){ - console.log(angleSpeed); - if(angleSpeed > maxAngle / 2){ - delta = -delta; - } - angleSpeed += angleSpeed * delta; - totalAngle += angleSpeed; - console.log('TOTAL: ' + totalAngle); - animationId = window.requestAnimationFrame(beginAnimateRoulette); + drawRouletteWheel(angleSpeed); + angleSpeed += startAngle; + totalAngle += startAngle; + setTimeout(() => { + animationId = window.requestAnimationFrame(beginAnimateRoulette); + }, 1000 / animationFPSRate); + }else{ window.cancelAnimationFrame(animationId!) animationId = null; @@ -230,15 +241,15 @@ function beginAnimateRoulette(){; } } -function resetRouletteAnimation(){ - if(animationId){ - window.cancelAnimationFrame(animationId!) - } - drawRouletteWheel(0); - animationId = null; - angleSpeed = 1; - totalAngle = 0; - delta = 0.2; -} +// function resetRouletteAnimation(){ +// if(animationId){ +// window.cancelAnimationFrame(animationId!) +// } +// drawRouletteWheel(0); +// animationId = null; +// angleSpeed = 1; +// totalAngle = 0; +// delta = 0.2; +// } canvasEl.addEventListener('click', startRoulette); \ No newline at end of file diff --git a/static/arrow-down.png b/static/arrow-down.png new file mode 100644 index 0000000000000000000000000000000000000000..f492a747af363a3628ca426c4fc02cb70737e6c5 GIT binary patch literal 11894 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 literal 0 HcmV?d00001