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
}
È stato utile?

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))

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top