更新游戏中的跳转

我正在做一个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; } 

奇怪的是,当我有无限的FPS(和更新号码),我的球员跳了大约10块。 当FPS增加时,它跳得更高。 如果我限制FPS,它跳了4块。 (块:32×32)我刚刚意识到问题是这样的:

 if(Input.keyPressed(38)) { this.velocityY -= 6; } 

我将-6加到velocityY上,这样Y就会按比例增加玩家的Y,而不是按时间增加。

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

你应该添加一个jumpAcceleration。 当玩家按下键(38)时你应该这样做

 this.velocityY -= jumpAcceleration * dt; 

其中dt是timeDelta / 1000000000.0。
你在代码中做的是在每次更新时将velocityY加6。 因此,在高FPS(例如300)时,您将从velocityY中减去6 * 300 = 1800,但是在FPS较低时(例如10),您将在每秒中从您的velocityY中减去60。 如果你想让你的游戏独立于FPS,你还必须在那里添加timeDelta。

也在谷歌search游戏循环。 有关于如何为您的游戏创建一个固体和FPS独立游戏循环的信息。

简单的解决scheme:只有在实际在地面上和/或站立时才加上跳跃速度。

像这样的东西:

 if (Input.keyPressed(38) && onGround) this.velocityY -= 6; 

实际的检查可能会更复杂。 例如,不要使用布尔值,你可以使用一些计数器canJump ,默认设置为1或2。 如果您尝试跳跃(按下按键;而不是按住!),并且计数器大于0,则应用速度并减less计数器。 这样就很容易实现像双跳或三跳的事情。