Pregunta

function(deltaTime) {
  x = x * FACTOR; // FACTOR = 0.9
}

Esta función se llama en un bucle de juego. En primer lugar asumir que se está ejecutando en una constante de 30 fps, por lo deltaTime siempre es 1/30.

Ahora el juego se cambia de manera deltaTime no siempre es 1/30, pero pasa a ser variable. ¿Cómo puedo incorporar deltaTime en el cálculo de x para mantener el "efecto por segundo" de la misma?


Y qué hay

function(deltaTime) {
  x += (target - x) * FACTOR; // FACTOR = 0.2
}
¿Fue útil?

Solución

x = x * Math.pow(0.9, deltaTime*30)

Editar

Para su nueva actualización:

x = (x-target) * Math.pow(1-FACTOR, deltaTime*30) + target;

Para mostrar cómo había llegado allí:

Let x0 sea el valor inicial, y Xn el valor después de n / 30 segundos. También sea T = objetivo, F = factor. A continuación:

x1 = x0 + (T-x0)F = (1-F)x0 + TF
x2 = (1-F)x1 + TF = (1-F)^2 * x0 + (1-F)TF + TF

Siguiendo con x3, x4, ... mostrará:

xn = (1-F)^n * x0 + TF * (1 + (1-F) + (1-F)^2 + ... + (1-F)^(n-1))

Ahora sustituyendo la fórmula para la suma de una secuencia geométrica dará el resultado anterior. Esto realmente sólo demuestra el resultado de n número entero, pero debería funcionar para todos los valores.

Otros consejos

x = x * powf(0.9, deltaTime / (1.0f / 30.0f))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top