随着每秒更新量的下降,这些方程式的跳跃大小会减小。使用delta值乘以重力和跳跃力减少的量,以及每次迭代时delta增加的时间(delta值是自上次更新以来经过的毫秒数),人们会认为它可以正常工作。 / p>
//d is delta
...
if(isFalling||isJumping){
elapsedTime +=d;
//the elapsed time is the total amount of time passed since one started jumping,
//so that's logical to add the amount of time since last update.
long tesquared = (long) Math.pow(elapsedTime, 2);
//amount of time elapsed squared.
jumpSpeed+=-0.0000005*elapsedTime*d;
//this is the amount that jumpspeed is taken down by every time.
if(jumpSpeed > 0){
isJumping = true;
} else {
isJumping = false;
}
double fGravity = 0.0000001*tesquared*d;
// this is the equation for gravity, the amount that the player goes down
yRend += jumpSpeed - fGravity;
//the amount it goes up, minus the amount it goes down.
xRend -= strafeSpeed;
oldyRend = yRend;
}
要开始跳跃,可以添加任意数量的jumpSpeed。
问题在于,当每秒的更新量减少时,跳跃的持续时间和数量会减少。我很确定这里的delta值很好,这意味着问题必须在方程本身。
我认为当delta更大时,fGravity
会更快地超越jumpSpeed
。
所以我的问题。如果问题确实存在于方程本身中,那么模拟玩家向上力量减去向下重力的正确方法是什么
jumpSpeed+=-0.0000005*elapsedTime*d;
和
double fGravity = 0.0000001*tesquared*d;
?
如果问题是delta值未正确应用,那么应用它的正确方法是什么?
答案 0 :(得分:2)
玩家没有“向上的力量”(除了他们跳跃的那一点)。强制传递动量生成速度。一旦在空中,他们确实感觉到向下力(即重力),这会使它们减速,最终产生负速度,使它们返回地面。
如果玩家开始以速度u
向上跳跃,那么在该跳跃开始后的t
时间,用于计算位置的经典等式为y = ut + 0.5 * at^2
。
在这种情况下,a
是引力(如果y
为“up”则为负数),给出y = u * t - 0.5 * g * t ^ 2
答案 1 :(得分:1)
基本上,跳跃的等式就是这样:
重力垂直施加并向下产生恒定的力。所以垂直速度是vy = vy0 - elapsedTime * g,其中g是重力常数,vy0是跳跃开始时的初始速度。
您无需计算经过的时间。只需在每一帧,你都可以这样做:
vy -= g * dt; // dt is the elapsed time since last frame
y += vy * dt;
x += vx * dt; // vx doesn't change in the jump