Kod jest bardzo powtarzalny. Staraj się unikać metody "kopiuj-wklej". Twój obecny kod jest trudny do czytania i utrzymywania.
Na przykład zamiast:
if(icon.equals("@")){
mapCharacters[logic.getLastX()][logic.getLastY()].setImage(null);
mapCharacters[x][y].setImage(new Image(Paths.get("src", "main", "resources", "textures/wariorStay.gif").toUri().toString()));
data[x][y]="@";
} else if(icon.equals("!")){
mapCharacters[logic.getLastX()][logic.getLastY()].setImage(null);
mapCharacters[x][y].setImage(new Image(Paths.get("src", "main", "resources", "textures/fly.gif").toUri().toString()));
data[x][y]="!";
} else if(icon.equals("*")){
mapCharacters[logic.getLastX()][logic.getLastY()].setImage(null);
mapCharacters[x][y].setImage(new Image(Paths.get("src", "main", "resources", "textures/skeleton.gif").toUri().toString()));
data[x][y]="*";
}
Wystarczyłoby coś w rodzaju:
final String fileName;
if (icon.equals("@")) {
fileName = "wariorStay";
} else if (icon.equals("!")) {
fileName = "fly";
} else if (icon.equals("*")) {
fileName = "skeleton";
} else {
break;
}
mapCharacters[logic.getLastX()][logic.getLastY()].setImage(null);
Path imagePath = Paths.get("src", "main", "resources", "textures/" + fileName + ".gif");
mapCharacters[x][y].setImage(new Image(imagePath.toUri().toString()));
data[x][y] = icon;
Bo po co np. przeklejać mapCharacters[logic.getLastX()][logic.getLastY()].setImage(null)
w trzy osobne miejsca, skoro to wywołanie jest za każdym razem identyczne?
A tego typu konstrukcje - czyli wielokrotne przeklejanie całych bloków, które różnią się tylko jednym detalem - to u ciebie norma (jak poniżej).
if(e.getCode().toString().equals("W")){
try {
controler.getLogic().moveUp();
controler.move();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
} else if(e.getCode().toString().equals("S")){
try {
controler.getLogic().moveDown();
controler.move();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
} else if(e.getCode().toString().equals("A")){
try {
controler.getLogic().moveLeft();
controler.move();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
} else if(e.getCode().toString().equals("D")){
try {
controler.getLogic().moveRight();
controler.move();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
i tak w kółko Macieju; widać, że na wszystko masz jedną receptę, czyli skopiować i przekleić.
Spróbuj zamiast tego ekstrahować powtarzające się fragmenty do mniejszych metod, parametryzując tylko różnice.
To nie są oczywiście bezpośrednie przyczyny problemu, z którym się zgłosiłeś, ale to jest taka można powiedzieć praprzyczyna. Bo tworzenie nieczytelnego kodu zawsze przyciąga różnorakie kłopoty. Choćby dlatego, że trudno się w nim połapać - jest też większe ryzyko, że coś się w nim rozjedzie w miarę rozbudowy.