2016-11-06 4 views
0

플레이어가 점프 할 때 나는 어떤 상수로 속도를 설정 한 다음 중력 * deltaTime에 의해 시간에 따라 상수를 감소시킵니다. 그러나 어떤 이유로이 점프 높이가 달라집니다. deltaTime을 메인 게임 루프의 상수로 대체하면이 문제가 사라지기 때문에 deltaTime과 관련이 있다고 생각합니다.libGDX 가변 높이 점프

다음은 revelvent 코드입니다.

GameState

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

새 변수 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); 
} 

나는이 당신을 도움이되기를 바랍니다.

0

점프 높이는 분명히 deltaTime 때문에 다양합니다. deltaTime은 각 프레임 사이의 시간이며이 시간은 프레임마다 다릅니다. 그래서 당신이 끊임없이 다른 숫자로 그것을 곱하면 점프의 높이가 항상 달라집니다.

velocity.y를 항상 같게 만듦으로써이를 해결할 수 있습니다.

사용자가 점프 할 때마다 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 
} 
+0

내가 알고있는 한 바로 그 순간이 바로 그 순간입니다. 플레이어가 점프하면 y 속도가 설정되고 플레이어가 중력을 업데이트 할 때마다 * deltaTime이 y 속도에서 뺍니다. 그래도 도움을 주셔서 감사합니다! – Calvin

0

오늘 아침에 문제가 해결되었습니다. 나중에 다시 발생할 수 있기 때문에 이것은 긴장하게 만듭니다. 그러나 지금은 문제가 아닙니다. 좋은 아이디어를 주셔서 감사합니다! 나는 Skype 통화이 문제가 발생 배경에서 진행되고있을 때마다, 내가 말할 수있는이 훨씬 더에 근무 한 후하지만 다른 시간에

편집 .