Ваши условия и логическая логика слишком сложны:
private void getInput() {
xMove = 0;
yMove = 0;
if (handler.getKeyManager().up) {
yMove = -speed;
lastPressed = handler.getKeyManager().up;
}
//...
}
private BufferedImage getCurrentAnimationFrame() {
if (handler.getKeyManager().left && lastPressed == handler.getKeyManager().left) {
return left.getCurrentFrame();
} else if ( !(handler.getKeyManager().left)) {
return left_idle.getCurrentFrame();
}
//...
return null;
}
То же, что и:
private void getInput() {
xMove = 0;
yMove = 0;
KeyManager km = handler.getKeyManager();
if (km.up) {
yMove = -speed;
lastPressed = true;
}
//...
}
private BufferedImage getCurrentAnimationFrame() {
KeyManager km = handler.getKeyManager();
if (km.left && lastPressed) {
// replaced lastPressed == handler.getKeyManager().left since km.left must be true
return left.getCurrentFrame();
} else if (!km.left) {
return left_idle.getCurrentFrame();
}
//...
return null;
}
Я не вижу, где вы устанавливаете lastPressed
в false
, выглядитдля меня это будет установлено в true (с первым нажатием клавиши) и остается true
.Поскольку это всегда true
, ваше условие в getCurrentAnimationFrame
эффективно:
private BufferedImage getCurrentAnimationFrame() {
KeyManager km = handler.getKeyManager();
if (km.left) {
return left.getCurrentFrame();
} else {
return left_idle.getCurrentFrame();
}
//UNREACHABLE CODE!
return null;
}
Даже если оно не остается верным, ваш код похож на if left, return left animation, if not left return left idle animation
.Я думаю, что ваши как-то смешанные логические значения с кодами клавиш, как вы говорите, «переменная lastPressed должна хранить значение последней нажатой клавиши».Я бы, вероятно, определил бы направление enum:
public enum DirectionEnum {
LEFT, RIGHT, UP, DOWN;
}
И использовал бы его так:
DirectionEnum lastPressed = null;
private void getInput() {
xMove = 0;
yMove = 0;
KeyManager km = handler.getKeyManager();
if (km.up) {
yMove = -speed;
lastPressed = DirectionEnum.UP;
}
//...
}
private BufferedImage getCurrentAnimationFrame() {
KeyManager km = handler.getKeyManager();
if (lastPressed == null) {
if (km.left) {
return left.getCurrentFrame();
}
//...
} else {
switch (lastPressed) {
case DOWN:
if (!km.down){
return down_idle.getCurrentFrame();
}
break;
//...
default:
throw new RuntimeException("Invalid direction " + lastPressed);
}
}
return null;
}
Но я не знаю, правильно ли это, потому что lastPressed
будет null
только в первый раз (или никогда), и тогда вы увидите только праздную анимацию.Так что вы, вероятно, должны решить, когда установить lastPressed
обратно на null
?