Pergunta

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

Esta função é chamada em um loop de jogo. Primeiro suponha que esteja funcionando com 30 qps constantes, então deltaTime é sempre 1/30.

Agora o jogo mudou então deltaTime Nem sempre é 1/30, mas se torna variável. Como posso incorporar deltaTime no cálculo de x Para manter o "efeito por segundo" o mesmo?


E sobre

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

Solução

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

Editar

Para sua nova atualização:

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

Para mostrar como cheguei lá:

Seja x0 o valor inicial e xn seja o valor após N/30 segundos. Deixe também t = alvo, f = fator. Então:

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

Continuando com x3, x4, ... mostrará:

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

Agora, substituir a fórmula pela soma de uma sequência geométrica fornecerá o resultado acima. Isso realmente só prova o resultado para o número inteiro n, mas deve funcionar para todos os valores.

Outras dicas

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top