libGDX:游戏万能速度

libGDX: game universal speed

我是 libGDX 的新手, 我正在尝试在我的游戏中制作一个功能,玩家点击一个按钮,整个游戏速度会提高 2 倍。 我不想改变每个游戏元素的速度,我正在寻找控制 'game tick' 速度的全局选项。

好吧,为了保存适当的帧独立应用程序(游戏),您必须使用两帧之间传递的时间。如果您使用 Game in the form a a float argument called delta or deltaTime. If you don't, you can still use Gdx.graphics.getDeltaTime() 获取它,Libgdx 已经在屏幕的渲染方法中为您提供了它。

如果您已经这样做了(您应该这样做!)。在游戏更新前将其乘以 2。

@Override
public void render(float delta){
    delta = delta * 2;
    //game logic
    ...
}

同意 Lestat 将 delta 乘以 2(或任何需要的因子)的观点。只是想向不同的代码添加一个建议,这些代码从绘制图形的代码计算(对象位置、碰撞和东西)。然后当你计算增量时,根据它的值也计算你的计算代码应该执行多少次,并执行多少次。之后再画画,就一次。 重点是,如果你加快时间(或者你在某些设备上的 FPS 很慢),你可能会错过一些重要的时间范围。 IE。你有一些子弹每帧移动 5px。而且你加快了你的时间(或帧速率下降)2 帧(和 2 次计算)之间的差异可能太大,如果你只将子弹速度乘以那个增量参数,你的移动步长可能太大,所以你的子弹可以避免一些(击中)检测,即穿过敌人而不击中它。所以主要的想法是在更小的步骤("game clock")中重复计算并且不要错过动作并尽可能多地绘制。

我写了这个滴答计时器来更新世界。它告诉世界每 50 毫秒更新一次它的状态,每秒 20 次。

每次都会调用 render 方法来更新不重要的东西,例如不需要更新世界的粒子效果和处于当前状态的世界以及以给定速度移动的 npc 实体。

要提高游戏速度,只需将游戏刻度阈值 ticktime 修改为较低的数值即可。但由于 Gdx 很可能 运行 60fps 将其设置为低于 16 将不会产生影响。

// time elapsed in the world in milliseconds
public long time = 0l;
// how long to wait between ticks, in milliseconds
public long ticktime = 50l;
// when did we last send a tick?
public long lastTick=0l;

   @Override
   public void render()
    {        
    float delta = Gdx.graphics.getDeltaTime();
    // convert to milliseconds
    time+=(long)(delta*1000);
    // Simple substraction to see if enough time passed for a world update
    if(time - ticktime > lastTick) {
        GameWorld.tick();
        long elapsed = time - lastTick;
        if(elapsed > ticktime) {
            long missed = elapsed / ticktime;
            if(missed > 3l) {
               System.err.println("Warning: skipping "+missed+" ticks");
            }
        }
        lastTick = time - (time % ticktime);
    }
    WorlRenderer.render(delta);