2D游戏物理,正确实现

3

我有一种隐隐的感觉,我做错了。它现在可以工作,重力会将物体向下拉向地面,但我很难控制物体的速度。

这是一个球向下跳跃和落下的过程。

我有另一个名为“jump”的函数,只需将 jSpeed 添加到它的 yVel 中。

我可以增加 gravity,它会下落得更快。

我可以增加 jSpeed 的速度,它会上升更长时间,但速度不会更快。

但我无法让它以更快的速度执行所有操作。它看起来非常缓慢,可能是因为我的模拟器平均运行在11 fps。

这是我的模拟器问题,还是我的问题?

float time = elapsedTime/1000F;
if (speed < maxSpeed){
    speed = speed + accel;
}
if(mY + mVelY < Panel.mHeight){ //0,0 is top-left
    mVelY += (speed);
}

if (!(mY + height >= Panel.mHeight)){
    mVelY = mVelY  + gravity ;
}

mX  =  (float) (mX +(mVelX * time));
mY =  (float) (mY + (mVelY * time));

你会调用这段代码多频繁?你有追踪自上次调用以来经过的时间吗?此外,与你的问题无关,但是:speed = speed + accel; -> speed 可能大于 maxSpeed - Gabriel Negut
@Gabriel 这段代码被称为每帧调用,已经跟踪了经过的时间。它使用了 System.currentTimeMilis(); 我更新了我的问题中的代码以展示这一点。 - user773737
1个回答

0

我觉得你的一般想法是正确的,但是你的代码有很多地方让人困惑。

我的问题主要与速度变量有关 - 在我看来,你的球被速度和加速度变量加速,直到达到最大速度。与此相对立的是重力向下拉扯(加速)球。

通常情况下,这不是你描述中的“跳跃”方式。所以对我来说,当玩家按下“跳跃”时,你应该将YVel设为jspeed,并且让重力部分的方程式使其回落 - 假如你删除了这段代码的话:

if(mY + mVelY < Panel.mHeight){ //0,0 is top-left
  mVelY += (speed);
}

然后它会上升一段时间,然后失去动力并下降 - 而上面的代码会一直向上推,直到它触顶,一旦开始下降就会立即将其推回。

我想知道速度和最大速度周围的代码是否应该作用于XVel而不是YVel,这样更有意义。


我认为它曾经对XVel产生过影响,这可能与摩擦有关。不过感谢你指出来。 - user773737
实际上,那可能已经解决了我的问题。现在,如果我想让它跑得更快,我认为我可以相对于跳跃速度增加重力。由于11 fps的限制,它在我的模拟器上看起来仍然很慢。 - user773737
模拟器的帧速率不应影响下落的速度 - 只会使其看起来更加跳动 - 如果我帮到了你,请接受这个回答。 - Elemental

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接