Modifica moltiplicando calcolo per l'uso a delta
-
28-09-2019 - |
Domanda
function(deltaTime) {
x = x * FACTOR; // FACTOR = 0.9
}
Questa funzione è chiamata in un ciclo di gioco. In primo luogo supporre che è in esecuzione in un costante 30 FPS, quindi è sempre deltaTime
1/30.
Ora il gioco viene modificato in modo deltaTime
non è sempre 1/30 ma diventa variabile. Come posso integrare deltaTime
nel calcolo del x
per mantenere l ' "effetto al secondo" lo stesso?
E che dire
function(deltaTime) {
x += (target - x) * FACTOR; // FACTOR = 0.2
}
Soluzione
x = x * Math.pow(0.9, deltaTime*30)
Modifica
Per il vostro nuovo aggiornamento:
x = (x-target) * Math.pow(1-FACTOR, deltaTime*30) + target;
Per mostrare come ci sono arrivato:
Sia x0 sia il valore iniziale, e Xn il valore dopo n / 30 secondi. lasciare che anche T = bersaglio, F = fattore. Poi:
x1 = x0 + (T-x0)F = (1-F)x0 + TF
x2 = (1-F)x1 + TF = (1-F)^2 * x0 + (1-F)TF + TF
Continuando con x3, x4, ... mostrerà:
xn = (1-F)^n * x0 + TF * (1 + (1-F) + (1-F)^2 + ... + (1-F)^(n-1))
Ora sostituendo la formula per la somma di una sequenza geometrica darà il risultato di cui sopra. Questa realtà dimostra solo il risultato per intero n
, ma dovrebbe funzionare per tutti i valori.
Altri suggerimenti
x = x * powf(0.9, deltaTime / (1.0f / 30.0f))