关于在 libgdx 中实现渲染方法的不同方法的疑问

doubts about implementing different approach of render method in libgdx

最近,我决定制作一款新游戏,并将这个机会交给 libgdx 框架。很久以前,我曾经在 Slick2D 中制作过一些游戏,我记得他们在更新(delta)和 draw()对象时的方法是不同的,然后现在在 libgdx 中只有 render(delta) ).所以我有了想法,抽象了游戏,并制作了我自己的 class 游戏和带有更新和绘制的屏幕。但是,现在我对 render 方法的参数增量有疑问。在互联网上观看一些关于 libgdx 实现概念更新和绘制的示例,人们将 delta 参数从渲染方法传递给更新和绘制方法。根据此描述,我的问题是:

  1. 是否可以实现更新和绘制方法的概念?
  2. 我应该将 delta 参数传递给 draw 方法吗?
  3. 如果在 update(delta) 方法中进行计算,draw 方法中 delta 参数的用途或用例是什么?
  1. 是的,separate concerns 通常是个好主意。如果您的游戏循环仅存在更新游戏逻辑和绘制游戏状态,那么这些方法会很好。当您的游戏发展壮大时,您可能需要添加额外的步骤(例如多个渲染通道、同步多人游戏等)。
  2. 您通常只在更新游戏逻辑时需要增量时间,而不是在渲染它时。但是,如果您确实需要它,那么将它作为参数传递就可以了。
  3. 这是自上次调用 render 方法以来的时间,以秒为单位。您可以使用它以独立于帧速率的方式更新您的游戏逻辑。例如。 calculate the correct position of your character, the correct frame of an animation,等等

请注意,仅按原样使用增量时间可能会导致例如在小便时传送并且不是离散的。因此,限制该值通常是个好主意(例如 delta = Math.min(delta, 1/30f);)。当您需要离散的游戏逻辑时,通常会使用 fixed time step

您可以利用 LibGDX 的 Scene2d 包:

https://github.com/libgdx/libgdx/wiki/Scene2d

Stage class 确实提供了单独的 act 和 draw 方法。所以 Game class 中的 render() 方法最终看起来像这样:

@Override
public void render() {      
    Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);   
    stage.act();
    stage.draw();
}