2016-11-06 3 views
0

Ich versuche, einen einfachen Jump'n'Run zu machen, und wenn der Spieler springt, stelle ich die Geschwindigkeit auf eine Konstante, und dann verringere diese Konstante im Laufe der Zeit durch die Schwerkraft * deltaTime. Aus irgendeinem Grund führt dies jedoch zu unterschiedlichen Sprunghöhen. Ich denke, es hat mit DeltaTime zu tun, denn wenn ich deltaTime durch eine Konstante in der Hauptspielschleife ersetze, verschwindet dieses Problem.libGDX Varying Jump Height

Hier ist der Revelvent-Code.

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); 
} 

Welt:

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 

Spieler:

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); 
} 

Jede Hilfe wäre sehr willkommen: ein Jump'n'Run funktioniert nicht gut, wenn der Spieler nicht der Fall ist Springe immer gleich hoch!

Antwort

0

Wie wäre es mit der Deklaration einer neuen Variablen firstY und einem neuen Wert 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; 
} 

Welt:

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); 
} 

Ich hoffe, dies wird Ihnen helfen.

0

Die Sprunghöhe variiert offensichtlich wegen der DeltaTime. Die deltaTime ist die Zeit zwischen jedem Bild, und diese Zeit variiert von Bild zu Bild. Wenn du es mit einer Zahl multiplizierst, die sich ständig unterscheidet, ist die Sprunghöhe immer unterschiedlich.

Sie können dies beheben, indem Sie einfach Ihre Velocity.y immer gleich sein.

Tun Sie einfach etwas wie, wann immer der Benutzer springt, machen Sie die velocity.y gleich einer bestimmten Konstante, dann machen Sie die Schwerkraft von jedem Rahmen (die Schwerkraft kann mit dem DeltaTime BTW multipliziert werden).

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

Genau das passiert im Moment, soweit ich weiß. Wenn der Spieler springt, wird die y-Geschwindigkeit eingestellt und jedes Mal, wenn der Spieler die Schwerkraft aktualisiert, wird * deltaTime von der y-Geschwindigkeit subtrahiert. Danke für die Hilfe! – Calvin

0

Aus welchem ​​Grund auch immer, an diesem Morgen das Problem behoben selbst. Das macht mich nervös, weil es später immer noch passieren könnte, aber im Moment ist es kein Problem. Danke euch allen für die guten Ideen!

EDIT Nachdem auf diese viel mehr gearbeitet hat, kann ich sagen, wenn ich einen Skype-Anruf Dieses Problem tritt in dem Hintergrund geht, aber zu keiner anderen Zeit.