2017-01-29 4 views
0

Ich arbeite an einem Pokemon Remake in libGDX und ich habe einige Probleme mit der Bewegung, ich kann den Spieler in ein Raster bewegen lassen, genau wie in den Spielen und ich bin glücklich mit was Ich habe. Allerdings möchte ich es so machen, dass wenn der Spieler nach links zeigt und der Spieler nach rechts tippt, der Spieler nach rechts dreht, ohne nach rechts zu gehen, bewegt sich der Spieler momentan in die Richtung, in die Sie drücken, egal was geschieht.libGDX Pokemon Style Movement (Drehen vor dem Bewegen)

Code:

// Detects if the player is sprinting 
    if (Gdx.input.isKeyPressed(Input.Keys.A)) { 
     speed = 2; 
    } else { 
     speed = 1; 
    } 

    // Moves the player 
    if (isMoving) { 
     // Sets the player animation 
     if (speed == 1) 
      player.setStance(Stance.WALKING); 
     else if (speed == 2) 
      player.setStance(Stance.RUNNING); 

     if (player.getSprite().getX() < targetX) { 
      player.getSprite().translateX(speed); 
     } 

     if (player.getSprite().getX() > targetX) { 
      player.getSprite().translateX(-speed); 
     } 

     if (player.getSprite().getY() < targetY) { 
      player.getSprite().translateY(speed); 
     } 

     if (player.getSprite().getY() > targetY) { 
      player.getSprite().translateY(-speed); 
     } 

     if (Math.abs(player.getSprite().getX() - targetX) <= 1 && Math.abs(player.getSprite().getY() - targetY) <= 1) { 
      player.getSprite().setPosition(targetX, targetY); 
      isMoving = false; 
     } 
    } else { 
     player.setStance(Stance.IDLE); 
    } 

    if (!lockMovement) { 
     if (Gdx.input.isKeyPressed(Input.Keys.UP)) { 
      if (!isMoving) { 
       player.setDirection(Direction.UP); 
       if (cellAvailable(player.getSprite().getX() + 8, player.getSprite().getY() + 24)) { 
        isMoving = true; 
        targetY = player.getSprite().getY() + 16; 
        targetX = player.getSprite().getX(); 
       } 
      } 
     } 

     if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) { 
      if (!isMoving) { 
       player.setDirection(Direction.DOWN); 
       if (cellAvailable(player.getSprite().getX() + 8, player.getSprite().getY() - 8)) { 
        isMoving = true; 
        targetY = player.getSprite().getY() - 16; 
        targetX = player.getSprite().getX(); 
       } 
      } 
     } 

     if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) { 
      if (!isMoving) { 
       player.setDirection(Direction.LEFT); 
       if (cellAvailable(player.getSprite().getX() - 8, player.getSprite().getY() + 8)) { 
        isMoving = true; 
        targetX = player.getSprite().getX() - 16; 
        targetY = player.getSprite().getY(); 
       } 
      } 
     } 

     if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) { 
      if (!isMoving) { 
       player.setDirection(Direction.RIGHT); 
       if (cellAvailable(player.getSprite().getX() + 24, player.getSprite().getY() + 8)) { 
        isMoving = true; 
        targetX = player.getSprite().getX() + 16; 
        targetY = player.getSprite().getY(); 
       } 
      } 
     } 
    } 

Hinweis: Stances umfassen IDLE, Gehen und RUNNING

Wegbeschreibung UP umfassen, AB, LINKS, RECHTS

Grunde möchte ich die Spieler IDLE bleiben und in die Richtung blicken, in die der Benutzer drückt DANN bewegen, wenn der Schlüssel noch gedrückt wird

Antwort

1

Sie können prüfen, ob der Player faci ist ng die Richtung, die Sie gedrückt haben oder nicht. Wenn er dann den Spieler bewegt, ändere einfach nur seine Richtung zu der Stelle, wo du gedrückt hast.

if(Gdx.input.isKeyPressed(Input.Keys.UP) { 
    if(player.getDirection() == Direction.UP) { 
     if(timeout < 0) { 
      // move player 
     } 
    } else { 
     player.setDirection(Direction.UP); 
     //Set some timeout in seconds 
     timeout = 0.5; 
    } 
} 

//Considering that this method is being called in your update method then reduce the timeout. 
timeout -= Gdx.graphics.getDeltaTime(); 

Tun Sie dasselbe für die anderen Pfeiltasten auch.

+0

Ich habe das versucht, und der Spieler bewegt sich immer noch, weil die Richtung festgelegt wird, und der Schlüssel wird immer noch den nächsten Rahmen gehalten, so dass der Spieler –

+0

@TylerFriesen eine Verzögerung zu diesem Code innerhalb der Else-Anweisung hinzufügen. Wenn also die setDirection aufgerufen wird, wartet sie eine zweite oder halbe Sekunde. – Squiddie

+0

@TylerFriesen Das Problem hier ist, dass Ihre Update-Methode mehrere Male in einer Sekunde aufgerufen wird. Wenn Sie eine beliebige Taste drücken, zeichnet sie die Eingabe auf, stellt die Richtung des Spielers ein und sofort wird Ihr Update erneut aufgerufen, während der Schlüssel noch nicht gedrückt ist, so dass Ihr Player bewegt wird. Sie sollten versuchen, was Squiddie gesagt hat. Ich habe meinen Code aktualisiert, um seinen Vorschlag hinzuzufügen. –