libGDX改变跳跃高度

时间:2016-11-06 05:09:59

标签: java libgdx

我正在尝试制作一个简单的平台游戏,当玩家跳跃时我将速度设置为某个常数,然后通过重力* 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);
}

任何帮助都会非常感激:如果玩家并不总是跳到相同的高度,那么平台游戏并不能很好地运作!

3 个答案:

答案 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通话,就会出现这个问题,但是没有其他时间。