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

この関数は、ゲーム ループで呼び出されます。まず、一定の 30 FPS で実行されていると仮定すると、deltaTime常に 1/30 になります。

ゲームが変更され、deltaTime常に 1/30 ではなく可変になります。「1秒あたりの効果」を同じに保つために、どのようdeltaTimeに計算に組み込むことができますか?x


そして何について

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

2 に答える 2

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

編集

新しい更新の場合:

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

どうやってそこにたどり着いたかを示すには:

初期値をx0、n/30秒後の値をxnとする。また、T=ターゲット、F=ファクターとします。それで:

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

x3、x4、... と続けると、次のように表示されます。

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

ここで、等比数列の和を式に代入すると、上記の結果が得られます。これは実際には integer の結果のみを証明しnますが、すべての値に対して機能するはずです。

于 2010-04-19T09:15:35.733 に答える
0

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

于 2010-04-19T09:16:19.320 に答える