Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

195
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda