【发布时间】:2015-02-06 23:00:58
【问题描述】:
我是 libGDX 的新手, 我正在尝试在我的游戏中制作一个功能,让玩家点击一个按钮,整个游戏速度提高 2 倍。 我不想改变每个游戏元素的速度,我正在寻找一个控制“游戏滴答”速度的全局选项。
【问题讨论】:
-
你的意思是把游戏的速度从 30 fps 改为 60 fps,例如?
我是 libGDX 的新手, 我正在尝试在我的游戏中制作一个功能,让玩家点击一个按钮,整个游戏速度提高 2 倍。 我不想改变每个游戏元素的速度,我正在寻找一个控制“游戏滴答”速度的全局选项。
【问题讨论】:
要保存适当的独立于帧的应用程序(游戏),您必须使用两帧之间传递的时间。如果您以名为 delta 或 deltaTime 的浮点参数的形式使用 Game,Libgdx 已经在屏幕的渲染方法中为您提供了这一点。如果没有,你仍然可以使用Gdx.graphics.getDeltaTime() 来获取它。
如果你已经这样做了(你应该这样做!)。只需在游戏更新前将其乘以 2。
@Override
public void render(float delta){
delta = delta * 2;
//game logic
...
}
【讨论】:
同意 Lestat 将 delta 乘以 2(或任何需要的因子)。只是想向从绘制图形的代码中计算(对象位置、碰撞和东西)的不同代码添加一个建议。然后当你计算 delta 时,根据它的值还计算你的计算代码应该执行多少次,并执行多少次。然后再画一次。 关键是,如果您加快时间(或者您在某些设备上的 FPS 速度较慢),您可能会错过一些重要的时间范围。 IE。你有一些子弹每帧移动 5px。而且您加快了 2 帧(和 2 次计算)之间的时间(或帧速率下降)差异可能太大,如果您仅将子弹速度与该 delta 参数相乘,您的移动步长可能太大,因此您的子弹可以避免一些(击中)检测,即在不击中敌人的情况下穿过敌人。所以主要的想法是在更小的步骤(“游戏时钟”)中重复计算,不要错过动作并尽可能多地绘制。
【讨论】:
我写了这个滴答计时器来进行世界更新。它告诉世界每 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);
【讨论】: