JavaFX gra 2D problem z implementacją ataku oraz ArrayList

0

cześć!
Tworze "grę" i mam problem z wprowadzeniem walki. Schemat działania wygląda tak
Wciskam WASD aby zrobić krok(jeśli gra pozwala) --> jeśli tak wywołaj metode move z controllera która odświeża grafikę oraz wywołaj metodę moveUp/Right/Left etc. z klasy logic --> w metodzie move wywołuje mi metodę opositMonster() która sprawdza czy mam obok siebie jakiegoś przeciwnika jeśli tak to kopiuje referencje tego przeciwnika z listy WSZYSTKICH przeciwników na mapie do listy przeciwnikówObokMnie, a dla sprawdzenia drukujemi w konsoli zawratość tabeli przeciwników obok mnie -->gdy klikam "E" wywołuje metode attack która pobiera index 0 z listy przecinikówObokMnie (która nie wiedzieć czemu jest pusta)

PROBLEM: Gdy podejdę do przeciwnika metoda sprawdzająca czy jest przeciwnik obok wykrywa go i debugger pokazuje że przeciwnik jest na tej liście przeciwnikówObokMnie tuż przed zakończeniem metody a po zakończeniu metody ta lista staje się pusta przez co metoda attack która pobiera przeciwnika pod indexem 0 z listy przeciwnikówObokMnie i odejmuje mu wstazane HP.

TU LINK DO GITHUB: https://github.com/s0bieskii/JavaFX

5
  1. Ten kod to dramat...
  2. DWA RAZY tworzysz obiekt GameLogic, jeden w main a drugi ZUPEŁNIE NIEZALEŻNY w klasie gameController, stąd też te obiekty nie są nijak powiązane ze sobą. Albo zrób jeden i przekaż w konstruktorze do kontrolera, albo wołaj tą logikę przez kontroler a to gameLogic logic=new gameLogic(); z main wyrzuć w ogóle
1

Nie wiem czy Ci pomoże mój komentarz ale coś czuje że twój 'gamedev' skończy się tak:

  1. JavaFX - po czasie: meh, za mało ficzerów. Czegoś mi brakuje...
  2. LibGDX / inne MonkeyJ - po czasie: meh za mało ficzerów, posklejane taśmą i trytytkami. Czegoś mi brakuje..
  3. Unity/Unreal/Godot - po czasie: może krowa ale da się pracować.
    Wniosek: jak się interesujesz GameDevem to olewaj w pi**u pośrednie technologie. Od razu naucz się jakiegoś Unity z .NETem.
3

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1