Я работаю над римейком 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, если ключ все еще удерживается
Я пробовал это, и игрок все еще движется, потому что направление устанавливается, и ключ по-прежнему удерживается в следующем кадре, поэтому игрок перемещается –
@TylerFriesen добавляет задержку к этому коду внутри оператора else. Поэтому, если вызывается setDirection, он ждет вторую или половину – Squiddie
@TylerFriesen, проблема заключается в том, что ваш метод обновления вызывается несколько раз в секунду. Когда вы нажимаете любую клавишу, она записывает ввод, устанавливает направление игроков и сразу же вызывается новое обновление, пока ваш ключ все еще не нажат, поэтому он перемещает ваш плеер. Вы должны попробовать, что сказал Squiddie. Я обновил свой код, чтобы добавить его предложение. –