Java 游戏中的更新和时间增量

Java 游戏中的更新和时间增量,java,updates,timedelta,Java,Updates,Timedelta,我正在制作一个Java游戏,我希望我的游戏在任何FPS上都能运行,所以我在每次更新之间使用时间增量。这是播放器的更新方法: 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

我正在制作一个Java游戏,我希望我的游戏在任何FPS上都能运行,所以我在每次更新之间使用时间增量。这是播放器的更新方法:

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和调用更新的方式(在Main类中):

奇怪的是,当我有无限的FPS(和更新次数)时,我的玩家会跳大约10个街区。当FPS增加时,它会跳得更高。如果我限制FPS,它将跳过4个街区。(区块:32x32) 我刚刚意识到问题在于:

if(Input.keyPressed(38)) {
    this.velocityY -= 6;
}
我在velocityY上加了-6,这会使玩家的Y值与更新次数成比例增加,而不是与时间成比例增加


但我不知道如何解决这个问题。

您可以使用System.nanoTime测量时间,然后除以1e9将其转换为秒。那么时间永远不应该是0。还有什么是速度?我希望速度是Math.sqrt(velocityX*velocityX+velocityY+velocityY),但是你的方程似乎是错的。谢谢,这很有用。有了nanoTime,我总是能得到实时的delta。但是,问题仍然存在。我的游戏在不同的FPS-s上运行不同。事实上,问题在于跳跃。我会在这上面添加一个编辑。考虑一个稍微不同的方法:保存上次更新你的世界的时间,然后只有当当前时间和上次更新之间的差异超过25MS(=40fPS)时才更新你的世界。此外,您的速度函数变得更简单:
velocityY+=g因为您知道每次通过一个
勾选
(在本例中为25ms)
if(Input.keyPressed(38)) {
    this.velocityY -= 6;
}