2010-04-19 8 views
1
function(deltaTime) { 
    x = x * FACTOR; // FACTOR = 0.9 
} 

Cette fonction est appelée dans une boucle de jeu. Supposons d'abord qu'il fonctionne à une vitesse constante de 30 FPS, donc deltaTime est toujours 1/30.Modification du calcul de multiplication pour utiliser le temps delta

Maintenant que le jeu est modifié, deltaTime n'est pas toujours 1/30 mais devient variable. Comment puis-je incorporer deltaTime dans le calcul de x pour garder le "effet par seconde" le même?


Qu'en est-

function(deltaTime) { 
    x += (target - x) * FACTOR; // FACTOR = 0.2 
} 
+0

Quel langage de programmation, environnement, etc? –

+0

Pour le deuxième problème, vous utilisez une variable delta = target - x. Ensuite, la fonction de mise à jour devient delta = delta * (1 - FACTOR), que vous savez déjà résoudre. Étant donné delta, vous pouvez toujours obtenir x = target - delta. – abc

Répondre

2
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à:

Soit x0 la valeur initiale et xn la valeur après n/30 secondes. Laisser aussi T = target, F = factor. Puis:

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

Poursuivant x3, x4, ... montrera:

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 séquence géométrique donnera au-dessus du résultat. Cela ne prouve réellement le résultat que pour le nombre entier n, mais cela devrait fonctionner pour toutes les valeurs.

+0

Merci, cela fonctionne. J'ai élargi la question avec un problème plus difficile. –

+0

Cela fonctionne également, merci encore. Celui-ci est plus difficile à comprendre si: p –

0

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