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

此函数在游戏循环中调用。首先假设它以恒定的 30 FPS 运行,所以deltaTime始终是 1/30。

现在游戏发生了变化,因此deltaTime并不总是 1/30,而是变得可变。如何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 为初始值,xn 为 n/30 秒后的值。也让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 回答