我正在尝试制作一个简单的平台游戏,当玩家跳跃时我将速度设置为某个常数,然后通过重力* deltaTime随时间减小该常数。但是,由于某种原因,这会导致跳跃高度变化。我认为它与deltaTime有关,因为当我将deltaTime替换为主游戏循环中的常量时,这个问题就会消失。
这是重新发现的代码。
游戏状态
public void resolveInput(float deltaTime) {
if(Gdx.input.isKeyJustPressed(Keys.ESCAPE))
Gdx.app.exit(); //temporary until we build menus
player.velocity.x = 0;
if(Gdx.input.isKeyPressed(Keys.A)) {
player.velocity.x -= Constants.PLAYER_MOVE_SPEED * deltaTime;
player.right = false;
}
if(Gdx.input.isKeyPressed(Keys.D)) {
player.velocity.x += Constants.PLAYER_MOVE_SPEED * deltaTime;
player.right = true;
}
if(Gdx.input.isKeyPressed(Keys.SPACE) && !player.falling) {
player.velocity.y = Constants.PLAYER_JUMP_SPEED;
player.falling = true;
}
}
public void update(float deltaTime) {
resolveInput(deltaTime);
world.update(deltaTime);
camHelper.update(deltaTime);
}
世界:
public void update(float deltaTime) {
player.update(deltaTime);
player.setPosition(resolveCollisions());
}
public Vector2 resolveCollisions() {
Rectangle p = player.getBoundingRectangle();
//The rest of the code doesn't get called in my test cases so I won't put it in here...
return new Vector2(p.x + player.velocity.x, p.y + player.velocity.y);
}//resolveCollisions
玩家:
public void update(float deltaTime) {
if(velocity.len() == 0)
sTime = 0;
else
sTime += deltaTime;
if(falling)
velocity.y -= Constants.GRAVITY * deltaTime;
velocity.y = MathUtils.clamp(velocity.y, -Constants.PLAYER_MAX_SPEED, Constants.PLAYER_MAX_SPEED);
}
任何帮助都会非常感激:如果玩家并不总是跳到相同的高度,那么平台游戏并不能很好地运作!
答案 0 :(得分:0)
如何声明新变量firstY
和新值JUMP_HEIGHT
?
GameState:
if(Gdx.input.isKeyPressed(Keys.SPACE) && !player.falling) {
player.firstY = player.getBoundingRectangle().y;
player.velocity.y = Constants.PLAYER_JUMP_SPEED;
player.falling = true;
}
世界:
public Vector2 resolveCollisions() {
Rectangle p = player.getBoundingRectangle();
//JUMP_HEIGHT is a height player always jumps
if(p.y + player.velocity.y >= player.firstY + Constants.JUMP_HEIGHT) {
player.velocity.y = 0;
return new Vector2(p.x + player.velocity.x, player.firstY + JUMP_HEIGHT);
}
return new Vector2(p.x + player.velocity.x, p.y + player.velocity.y);
}
我希望这会对你有所帮助。
答案 1 :(得分:0)
由于deltaTime,跳跃高度明显不同。 deltaTime
是每帧之间的时间,这个时间因帧而异。这就是为什么,如果你将它乘以一个经常不同的数字,那么跳跃高度总会不同。
你可以通过提高你的速度来解决这个问题。总是一样。
只要做一些事情,每当用户跳跃时,使velocity.y等于某个常数,然后使重力从每一帧中减去它(重力可以乘以deltaTime btw)。
public static final int GRAVITY = -15;
public void onJump(){
velocity.y = 300;
}
public void update(float deltaTime){
velocity.add(0, GRAVITY * deltaTime); //make the gravity detract from the upwards velocity each frame
}
答案 2 :(得分:0)
无论出于何种原因,今天早上问题解决了。这让我很紧张,因为它可能会在以后再次发生,但现在它不是问题。谢谢大家的好主意!
修改的 在完成了这项工作之后,我可以说,只要我在后台进行Skype通话,就会出现这个问题,但是没有其他时间。