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

209
Vistas
Tratando de invertir una curva de relajación

Actualmente estoy trabajando con lienzo, muevo un objeto de izquierda a derecha perfectamente a través de esta función de aceleración:

 export const easeInQuad = (t, b, c, d) => { return c * (t /= d) * t + b; };

Paso como parámetro lo siguiente: tiempo transcurrido (ms), valor inicial (px), cambio total (comienzo - finalización en px), duración total (ms)

Funciona perfectamente en los dos lados, EXCEPTO cuando cambia el lado, hace un doble guión.

¿Ensucio algo?

Aquí es donde encontramos la función: https://riptutorial.com/es/html5-canvas/example/18488/easing-using-robert-penners-equations

Aquí está la función de animación completa:

 requestAnimationFrame(animate); function animate(time) { ctx.clearRect(0, 0, canvasWidth, canvasHeight); ctx.beginPath(); for (let [playerKey, player] of Object.entries(room.players)) { beginningValue = cache[playerKey].x * areaX; endingValue = room.players[playerKey].x * areaX; totalChange = endingValue - beginningValue; let height = 0; if (playerKey === "p" + (local.playerID + 1)) { height = canvasHeight - paddleHeight; ctx.fillStyle = "#56dbd4"; } else { ctx.fillStyle = "#d86ef0"; } if (!startTime) { startTime = time; } let elapsedTime = Math.min(time - startTime, totalDuration); let easedX; console.log(beginningValue + " --- to --- " + endingValue); if (endingValue > beginningValue) { easedX = easeInQuad( elapsedTime, beginningValue, totalChange, totalDuration ); } else if (endingValue < beginningValue) { easedX = easeInQuad( elapsedTime, endingValue, totalChange, totalDuration ); } else { easedX = endingValue; } if (easedX > endingValue) { easedX = endingValue; } ctx.rect(easedX - paddleWidth / 2, height, paddleWidth, paddleHeight); ctx.fill(); if (time < startTime + totalDuration) { requestAnimationFrame(animate); } } }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Debe cambiar la condición final para verificar si nunca pasa el límite:

 if(beginningValue > endingValue) { if(easedX<endingValue){ easedX=endingValue; } } else { if(easedX>endingValue){ easedX=endingValue; } }

Mira este codepen: https://codepen.io/fernandezremi/pen/XWeoejW

Gracias a @Trehinos por su ayuda y esta respuesta (en Discord "Les joies du code")

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