【问题标题】:libGDX: game universal speedlibGDX:游戏通用速度
【发布时间】:2015-02-06 23:00:58
【问题描述】:

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

【问题讨论】:

  • 你的意思是把游戏的速度从 30 fps 改为 60 fps,例如?

标签: java android libgdx


【解决方案1】:

要保存适当的独立于帧的应用程序(游戏),您必须使用两帧之间传递的时间。如果您以名为 deltadeltaTime 的浮点参数的形式使用 Game,Libgdx 已经在屏幕的渲染方法中为您提供了这一点。如果没有,你仍然可以使用Gdx.graphics.getDeltaTime() 来获取它。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我写了这个滴答计时器来进行世界更新。它告诉世界每 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多