Question

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

Cette fonction est appelée dans une boucle de jeu. Supposons d'abord qu'il est en cours d'exécution à une constante 30 FPS, donc deltaTime est toujours 1/30.

Maintenant, le jeu est changé si deltaTime est pas toujours 1/30 mais devient variable. Comment puis-je intégrer deltaTime dans le calcul de x pour maintenir l ' « effet par seconde » même?


Qu'en est-

function(deltaTime) {
  x += (target - x) * FACTOR; // FACTOR = 0.2
}
Était-ce utile?

La solution

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

Modifier

Pour votre nouvelle mise à jour:

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

Pour montrer comment je suis arrivé là-bas:

Soit X0 la valeur initiale et la valeur XN soit après n / 30 secondes. T = laisser aussi la cible, F = facteur. Puis:

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

En continuant avec x3, x4, ... indique:

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

Maintenant, en remplaçant la formule pour la somme d'une suite géométrique donnera le résultat ci-dessus. Cela prouve vraiment que le résultat pour n entier, mais il devrait fonctionner pour toutes les valeurs.

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top