【发布时间】:2014-03-14 12:45:26
【问题描述】:
我在 Screen 类的 render 方法中检查了 delta 值。我看到它不是恒定的。任何人都可以说出它来自哪里以及它是什么吗?不同的屏幕尺寸有区别吗?如果是这样,我们该如何克服呢?我问这个是因为我的玩家跳跃取决于增量时间,有时它跳得太高.....
【问题讨论】:
我在 Screen 类的 render 方法中检查了 delta 值。我看到它不是恒定的。任何人都可以说出它来自哪里以及它是什么吗?不同的屏幕尺寸有区别吗?如果是这样,我们该如何克服呢?我问这个是因为我的玩家跳跃取决于增量时间,有时它跳得太高.....
【问题讨论】:
deltaTime 与屏幕尺寸无关。这是最后一帧被渲染所花费的时间。在 LibGDX 的情况下渲染还包括您在 render() 方法中执行的所有逻辑。
通常您希望游戏在不同设备上以相同的速度运行。如果你的渲染方法看起来像这样......
public void render(float deltaTime) {
float speed = 5f;
position = position + speed;
}
...那么位置在快速设备上的变化会更快,而在慢速设备上的变化速度会变慢,这只是因为渲染方法被调用的次数不同。
为了克服这个问题,有 deltaTime 在 LibGDX 的情况下以秒为单位。要让位置在不同设备上以相同的速率变化,您通常会这样做:
public void render(float deltaTime) {
float speedPerSecond = 5f;
position = position + (speedPerSecond * deltaTime);
}
【讨论】:
render(delta) 方法中的float delta 是最后一帧和本帧之间的时间,以秒为单位。您可以通过调用Gdx.graphics.getDelta() 在任何地方获取此值。
该值在 n 帧上平滑。
要获得实时信息(在大多数情况下这并不是真正需要的),您可以致电Gdx.graphics.getRawDeltaTime()。
此值用于根据帧之间经过的时间移动游戏中的对象,而不是以固定数量的像素移动它们。为此,您可以简单地将您的 movementSpeed 与此 delta 相乘,以获得您的对象应该行进的距离。
我建议限制您的 delta 时间,因为巨大的 delta 时间(由慢速设备或其他原因引起)可能会搞砸,例如碰撞检测。例如,要将其限制为 30FPS 的 delta 时间,您可以简单地说 delta = Math.min(delta, 1/30);
【讨论】:
scene2D Stage 将其限制为 1/30。因此,如果您在 30FPS 下玩游戏,则增量不再计算在内。尝试使用不同的值并查看最适合您的值。