2017-01-29 5 views
0

Я работаю над римейком Pokemon в libGDX, и у меня возникают проблемы с движением, я могу заставить игрока двигаться в сетке, как в играх, и я доволен тем, что У меня есть. Тем не менее, я хочу сделать так, чтобы, если игрок смотрит влево, а игрок крана справа, игрок поворачивается вправо, не двигаясь вправо, в настоящее время игрок движется в направлении, которое вы нажимаете, несмотря ни на что.libGDX Pokemon Style Movement (Turning to Moving)

Код:

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

Примечание: Stances включает IDLE, ходя и RUNNING

направления включают вверх, вниз, влево, вправо

По сути, я хочу, чтобы игрок бездействует и перед тем, как пользователь нажимает кнопку THEN, если ключ все еще удерживается

ответ

1

Что вы можете сделать, это проверить, является ли игрок faci в направлении, которое вы нажали или нет. Если он затем переместит игрока, просто измените его направление на лицо, где вы нажали.

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

Проделайте то же самое для других клавиш со стрелками.

+0

Я пробовал это, и игрок все еще движется, потому что направление устанавливается, и ключ по-прежнему удерживается в следующем кадре, поэтому игрок перемещается –

+0

@TylerFriesen добавляет задержку к этому коду внутри оператора else. Поэтому, если вызывается setDirection, он ждет вторую или половину – Squiddie

+0

@TylerFriesen, проблема заключается в том, что ваш метод обновления вызывается несколько раз в секунду. Когда вы нажимаете любую клавишу, она записывает ввод, устанавливает направление игроков и сразу же вызывается новое обновление, пока ваш ключ все еще не нажат, поэтому он перемещает ваш плеер. Вы должны попробовать, что сказал Squiddie. Я обновил свой код, чтобы добавить его предложение. –