我正在制作一个 Java 游戏,我希望我的游戏在任何 FPS 上运行相同,所以我在每次更新之间使用时间增量。这是 Player 的更新方法:
public void update(long timeDelta) {
//speed is the movement speed of a player on X axis
//timeDelta is expressed in nano seconds so I'm dividing it with 1000000000 to express it in seconds
if (Input.keyDown(37))
this.velocityX -= speed * (timeDelta / 1000000000.0);
if (Input.keyDown(39))
this.velocityX += speed * (timeDelta / 1000000000.0);
if(Input.keyPressed(38)) {
this.velocityY -= 6;
}
velocityY += g * (timeDelta/1000000000.0); //applying gravity
move(velocityX, velocityY); /*this is method which moves a player
according to velocityX and velocityY,
and checking the collision
*/
this.velocityX = 0.0;
}
这就是我计算 timedelta 并调用 update 的方式(这是在 Main 类中):
lastUpdateTime = System.nanoTime();
while(Main.running) {
currentTime = System.nanoTime();
Update.update(currentTime - lastUpdateTime);
Input.update();
Render.render();
measureFPS();
lastUpdateTime = currentTime;
}
奇怪的是,当我拥有无限的 FPS(和更新数量)时,我的玩家跳跃了大约 10 个方块。当 FPS 增加时,它会跳得更高。如果我限制 FPS,它会跳 4 个方块。(块:32x32)我刚刚意识到问题是这样的:
if(Input.keyPressed(38)) {
this.velocityY -= 6;
}
我将 -6 添加到velocityY 中,这会增加玩家的 Y 与更新数量而不是时间成正比。
但我不知道如何解决这个问题。