Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

196
Views
¿Hay alguna forma de inicializar la API de Canvas?

Ahora estoy creando una ruleta personalizada, y los jugadores pueden ingresar el texto que quieran. cuando hago clic en el botón, la función renderRoulette funciona. Y este es el contexto interno de la función renderRoulette

 rouletteCanvas.style.display = "block"; // the initial state of rouletteCanvas's display is 'none' // #customize elements are the inputs of the text that users made. let customize = document.querySelectorAll("#customize"); let len = customize.length; const canvas = document.querySelector(".roulette-panel"); // I want to draw here. let width = canvas.width; let height = canvas.height; const ctx = canvas.getContext("2d"); // ctx Initialization ctx.clearRect(0, 0, width, height); const devide = len; const degree = 360; const goalDegree = 270 + degree / devide; for (let i = 0; i < devide; i++) { let json = { first: (degree / devide) * i, last: (degree / devide) * (i + 1), text: `${i + 1}`, }; data.push(json); } // Draw a circular sector data.forEach((item) => { ctx.save(); ctx.beginPath(); ctx.lineWidth = 2; ctx.strokeStyle = "gray"; ctx.moveTo(width / 2, height / 2); ctx.arc( width / 2, height / 2, width / 2, degreesToRadians(item.first), degreesToRadians(item.last), false ); ctx.closePath(); ctx.stroke(); ctx.restore(); ctx.save(); let half = Math.abs(item.first - item.last) / 2; let degg = item.first + half; let xx = ((Math.cos(degreesToRadians(degg)) * width) / 2) * 0.7 + width / 2; let yy = ((Math.sin(degreesToRadians(degg)) * width) / 2) * 0.7 + height / 2; let minus = ctx.measureText(item.text).width / 2; ctx.font = "bold 15px sans-serif"; ctx.fillText(item.text, xx - minus, yy); ctx.restore(); });

Cada vez que hago clic en el botón, quiero eliminar todas las formas de sectores circulares dibujadas previamente y volver a dibujarlas, así que utilicé el código ctx.clearRect(0, 0, ancho, alto); . Sin embargo, incluso si hace clic en el botón después, se dibujará sobre la imagen existente. ¿Cómo lo inicializo?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Tengo la sensación de que guardar y restaurar en su código le está causando algunos problemas, probé una versión más simple de su código y ctx.clearRect(0, 0, width, height) funciona bien.

Aquí está el código:

 const canvas = document.querySelector(".roulette-panel"); const ctx = canvas.getContext("2d"); let width = height = 100; const devide = 8; let data = [] for (let i = 0; i < devide; i++) { data.push({ first: (360 / devide) * i, last: (360 / devide) * (i + 1) }); } function draw() { ctx.clearRect(0, 0, width, height); ctx.beginPath(); data.forEach((item) => { ctx.moveTo(width / 2, height / 2); ctx.arc(50, 50, 45, item.first * Math.PI / 180, item.last * Math.PI / 180 ); item.first += 0.5 item.last += 0.5 }); ctx.stroke(); } setInterval(draw, 40)
 <canvas class="roulette-panel"></canvas>

Este código usa setInterval para eliminar todas las formas de sectores circulares dibujadas previamente y dibujar una nueva en una nueva posición creando el efecto de movimiento.


Aquí está el mismo código pero con el clearRect comentado:

 const canvas = document.querySelector(".roulette-panel"); const ctx = canvas.getContext("2d"); let width = height = 100; const devide = 8; let data = [] for (let i = 0; i < devide; i++) { data.push({ first: (360 / devide) * i, last: (360 / devide) * (i + 1) }); } function draw() { //ctx.clearRect(0, 0, width, height); ctx.beginPath(); data.forEach((item) => { ctx.moveTo(width / 2, height / 2); ctx.arc(50, 50, 45, item.first * Math.PI / 180, item.last * Math.PI / 180 ); item.first += 0.5 item.last += 0.5 }); ctx.stroke(); } setInterval(draw, 40)
 <canvas class="roulette-panel"></canvas>

Podemos ver claramente un efecto diferente.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!