我正在使用libgdx制作游戏。现在,每个角色都有一个速度,实际上对应于游戏在更新角色之前等待的渲染次数。例如,如果角色的速度为15,则每15次渲染将更新一次。我意识到这不是必须要做的。
这样做的正确方法是什么?我真的想用%来制作速度,比如角色的速度是85%。
答案 0 :(得分:9)
使用delta
。
Gdx.graphics.getDeltaTime()
方法返回secods。通常这个值非常小,等于1 / FPS。
@Override
public void render()
{
// limit it with 1/60 sec
float dt = Math.min(Gdx.graphics.getDeltaTime(), 1 / 60f);
// then move your characted according to dt
player.pos = player.pos + player.speed * dt;
// or, you could mute the speed like this:
player.pos = player.pos + player.speed * dt * 0.85;
}
答案 1 :(得分:2)
当您计算对象的下一个位置时,只需将其速度乘以Gdx.graphics.getDeltaTime(),因此自上次渲染以来经过的时间越多,对象将移动越多。无论FPS如何,移动速度都是恒定的。
然而,像这样的简单解决方案总是有一个问题!如果您要移动子弹,可能会发生自上次渲染以来已经过了太多时间(特别是在移动设备上)。即半秒,并且那时你的子弹移动,即100px并移动到一些目标,但由于它从未在检测范围内(跳过它)目标将被错过,即使它不是假设这样做 - 玩家瞄准好。
所以,如果只是移动一些物体不是你想要的,但是你需要在一些常规步骤中进行移动,更好的方法是不要将速度乘以增量时间,而是重复移动和所有计算(检测和东西)取决于增量时间。即:
你有方法向左移动(),它将对象移动一步,并且运动量一切正常。
您的方法应该每秒调用20次(步长需要50毫秒)。
您测量自上次渲染后的时间,它是100mS,表示您的对象需要移动2步
不要只是乘以它的速度并进行一次计算 - 而不是重复整个计算过程2次!调用你的left()方法两次!
如果自上次绘图后的时间少于50毫秒 - 那么就跳过计算,然后像上一帧中那样绘制图形。
这样您就可以将绘图速率与绘图速率分开。所有设备的计算速率都相同,但绘图取决于设备的性能。