【问题标题】:2d game physics, doing it right2d 游戏物理,做对了
【发布时间】:2011-06-15 07:31:04
【问题描述】:

我偷偷怀疑我做错了。它现在起作用了,重力将物体拉向地面,但我在操纵物体的速度时遇到了麻烦。

这是什么,是一个球向地面跳跃和落下。

我有另一个名为“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 此代码每帧调用一次,并且正在跟踪经过的时间。它正在使用System.currentTimeMilis(); 我更新了我的问题中的代码以显示这一点

标签: android 2d physics


【解决方案1】:

我认为您在这里的总体思路是正确的,但您的代码有很多令人困惑的地方。

我的问题主要与可变速度有关 - 在我看来,您的球正在通过可变速度和加速度加速,直到达到最大速度。与此相反的是重力将球拉下(加速)。

现在通常这不是您描述的“跳跃”方式。所以对我来说,当玩家点击“跳跃”时,你应该将 YVel 设置为 jspeed 并让等式的重力部分将其拉回——也就是说,如果你删除了代码:

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

然后它会上升一点,然后失去重力的动量并返回 - 因为上面的代码一直向上推动它,直到它到达顶部,一旦它开始下降,就会把它推回来。

我想知道有关 speed 和 maxspeed 的代码是否应该像您编写的那样作用于 XVel 而不是 YVel - 这会更有意义。

【讨论】:

  • 我认为它确实对 XVel 起作用过一次,并且与摩擦有关。不过,感谢您指出这一点。
  • 实际上,这可能解决了我的问题。现在,如果我想让它跑得更快,我想我可以增加重力,相对于跳跃速度。由于 11 fps 的问题,它在我的模拟器上仍然看起来很慢
  • 模拟器 fps 不应该影响下落的速度 - 只是让它看起来更跳跃 - 如果我帮助了你,请接受这个回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2013-09-20
相关资源
最近更新 更多