Modificando o cálculo multiplicador para usar o tempo delta
-
28-09-2019 - |
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
}
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))