gpt4 book ai didi

c++ - 使用增量时间时如何保持跳跃高度相同?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:13 24 4
gpt4 key购买 nike

我正在使用增量时间,这样我就可以使我的程序帧速率独立。但是我无法获得相同的跳跃高度,角色总是在较低的帧速率下跳得更高。

变量:

const float gravity = 0.0000000014f;
const float jumpVel = 0.00000046f;
const float terminalVel = 0.05f;
bool readyToJump = false;
float verticalVel = 0.00f;

逻辑代码:

if(input.isKeyDown(sf::Keyboard::Space)){
if(readyToJump){
verticalVel = -jumpVel * delta;
readyToJump = false;
}
}

verticalVel += gravity * delta;
y += verticalVel * delta;

我确定增量时间是正确的,因为角色可以很好地水平移动。

无论帧速率如何,如何让我的角色以相同的方式跳跃?

最佳答案

计算新位置的公式为:

position = initial_position + velocity * time

考虑到根据函数降低速度的重力:

velocity = initial_velocity + (gravity^2 * time)

注意:在这种情况下,重力与引力不同。最终公式变为:

position = initial_position + (initial_velocity + (gravity^2 * time) * time

从上面的等式可以看出,initial_position 和 initial_velocity 不受时间影响。但在您的情况下,您实际上将初始速度设置为 -jumpVelocity * delta

帧率越低,delta的值就越大,因此角色会跳得更高。解决办法就是改

if(readyToJump){
verticalVel = -jumpVel * delta;
readyToJump = false;
}

if(readyToJump){
verticalVel = -jumpVel;
readyToJump = false;
}

编辑:

以上应该给出了一个很好的估计,但它并不完全正确。假设 p(t) 是时间 t 之后的位置(在本例中为高度),则 v(t) = p'(t )',加速度由 a(t) = v'(t) = p''(t)` 给出。因为我们知道加速度是恒定的;即重力,我们得到以下内容:

a(t) = g
v(t) = v0 + g*t
p(t) = p0 + v0*t + 1/2*g*t^2

如果我们现在计算 p(t+delta)-p(t),即从一个实例到另一个实例的位置及时变化,我们得到以下结果:

p(t+delta)-p(t) = p0 + v0*(t+delta) + 1/2*g*(t+delta)^2 - (p0 + v0*t + 1/2*g*t^2)
= v0*delta + 1/2*g*delta^2 + g*delta*t

原始代码未考虑 delta 的平方或额外项 g*delta*t*。更准确的方法是存储增量增量,然后使用上面给出的 p(t) 公式。

示例代码:

const float gravity = 0.0000000014f;
const float jumpVel = 0.00000046f;
const float limit = ...; // limit for when to stop jumping

bool isJumping = false;
float jumpTime;

if(input.isKeyDown(sf::Keyboard::Space)){
if(!isJumping){
jumpTime = 0;
isJumping = true;
}
else {
jumpTime += delta;
y = -jumpVel*jumpTime + gravity*sqr(jumpTime);
// stop jump
if(y<=0.0f) {
y = 0.0f;
isJumping = false;
}
}
}

注意:我没有编译或测试上面的代码。

关于c++ - 使用增量时间时如何保持跳跃高度相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17263580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com