使用libgdx进行游戏速度

时间:2014-02-18 18:11:58

标签: libgdx

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

这样做的正确方法是什么?我真的想用%来制作速度,比如角色的速度是85%。

2 个答案:

答案 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毫秒 - 那么就跳过计算,然后像上一帧中那样绘制图形。

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