使用libgdx的游戏中的速度

使用libgdx的游戏中的速度,libgdx,Libgdx,我正在用libgdx做一个游戏。现在,每个角色都有一个速度,实际上对应于更新角色之前游戏等待渲染的次数。例如,如果角色的速度为15,则将每渲染15次更新一次。我意识到这不是必须要做的 正确的方法是什么?我真的想用%来表示速度,例如一个字符的速度是85%。使用delta Gdx.graphics.getDeltaTime()方法返回自上次渲染帧以来的秒数。通常该值非常小,等于1/FPS @Override public void render() { // limit it with 1

我正在用libgdx做一个游戏。现在,每个角色都有一个速度,实际上对应于更新角色之前游戏等待渲染的次数。例如,如果角色的速度为15,则将每渲染15次更新一次。我意识到这不是必须要做的


正确的方法是什么?我真的想用%来表示速度,例如一个字符的速度是85%。

使用
delta

Gdx.graphics.getDeltaTime()
方法返回自上次渲染帧以来的秒数。通常该值非常小,等于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;
}

计算对象的下一个位置时,只需将其速度乘以Gdx.graphics.getDeltaTime(),因此自上次渲染以来经过的时间越长,对象移动的次数就越多。移动速度将是恒定的,无论FPS是多少

然而,像这样的简单解决方案总是有一个陷阱!如果正在移动项目符号,则可能会发生自上次渲染(特别是在移动设备上)以来经过的时间过长的情况。也就是说,半秒,在这段时间里,你的子弹移动了100像素,穿过了一些目标,但由于它从来都不在探测范围内(跳过了它),目标将被错过,即使它不应该这样做-玩家瞄准得很好

所以,如果只是移动某个物体不是你想要的,但你需要有规律的移动,更好的方法不是用增量时间乘以速度,而是根据增量时间重复移动和所有计算(检测和其他)。即:

  • 您有一个方法move left(),它将对象移动一步,并且随着移动量的增加,一切都正常工作

  • 您的方法应每秒调用20次(步骤需要50毫秒)

  • 您测量了自上次渲染以来的时间,它是100毫秒,这意味着您的对象需要移动2步

  • 不要只是增加速度,然后做一次计算——而不是重复整个计算过程2次!调用left()方法两次

  • 若上次绘制后的时间小于50毫秒,那个么跳过计算,只需像在上一帧中一样绘制图形即可

这样,您就可以将计算速率与绘图速率分离。所有设备的计算速率相同,但绘图将取决于设备性能