Kiedy bohater spotka się z wrogiem

Mamy już bardzo wiele zrobione w naszej grze. Przyszła więc pora na krok do przodu w projekcie i określenie warunków kolizji. Kolizja w rozumieniu co się ma wydarzyć, kiedy np. nasz bohater zostanie trafiony wrogim strzałem. Od razu powiem, że dziś zajmiemy się tylko częścią kolizji jaka będzie zachodzić w naszej grze, ponieważ wpis byłby zbyt długi i przysnęli byście przy czytaniu.

 

Przemyślenia

Podstawowe kolizje jakie będą zachodzić w naszej grze to:

  • Strzał bohatera – potwór,
  • Potwór – bohater,
  • Potwór – baza,
  • Strzał potwora – bohater,
  • Strzał potwora – baza.

Teraz zajmiemy się napisaniem i omówieniem każdej linijki kodu.

 

Kolizja strzał bohatera – potwór

Przy tej kolizji chcemy, aby zostało odjęte życie naszego bohatera o ilość punktów równą sile strzału oraz aby pocisk został usunięty.

        for(Iterator<Shoot> it = strzaly.iterator(); it.hasNext();) {
            Shoot shoot = it.next();
            for(Iterator<Monster> pot = potwory.iterator(); pot.hasNext();) {
                Monster p = pot.next();
                if (shoot.overlaps(p)) {
                    p.setHp(p.getHp() - shoot.getStrong());
                    if(p.getHp() < 1){
                        player.setScore(player.getScore() + p.getScore());
                        pot.remove();
                    }
                    it.remove();
                }
            }
        }

Pierwsza linijka tworzy nam iterator listy strzały, która przechowuje obiekty klasy Shoot. Znaczy to tyle, że zmienna it, to nasz iterator listy strzały. W kolejnej linijce znajduje się nowa zmienna shoot, zainicjalizowana przez kolejny element listy strzały. Poniższe dwie linijki tworzą nam kolejny iterator operujący na liście potworów – potwory. Następnie sprawdzany jest warunek, czy element z listy strzały pokrywa się z elementem z listy potwory. Jeśli warunek jest spełniony należy ustawić nowe życie potworka na obecną ilość punktów życia – siła strzału. Poniżej zostaje sprawdzony kolejny warunek, czy ilość życia potworka jest mniejsza od jeden, jeśli tak wtedy następuje zwiększenie wyniku rozgrywki o wartość danego potworka oraz zostaje usunięty potworek. Po zakończeniu bloku warunku w powyższym kodzie pozostaje jeszcze jedna linijka. Odpowiedzialna jest za usunięcie strzału w chwili, kiedy nastąpi nałożenie się na siebie strzału i potworka.

 

Kolizja potwór – bohater/baza

Tym razem za pomocą jednego kodu rozwiążemy dwie kolizje. W momencie, kiedy potwór zetknie się z naszym bohaterem, zostanie odjętych 10 punktów życia bohatera oraz potwór zostanie uśmiercony. W przypadku gdy potwór wejdzie na obszar bazy, z życia bazy zostanie odjętych również 10 punktów.

        for(Iterator<Monster> pot = potwory.iterator(); pot.hasNext();) {
            Monster p = pot.next();
            Rectangle rec = new Rectangle(player.x - player.radius, player.y - player.radius, player.radius * 2,player.radius * 2);
            if(p.overlaps(rec)){
                player.setHp(player.getHp() - 10);
                pot.remove();
            }

            if(p.overlaps(baza)){
                baza.setHp(baza.getHp() - 10);
                pot.remove();
            }
        }

W taki sam sposób jak robiliśmy to w pierwszej kolizji tworzymy iterator dla naszej listy potworów – potwory. Następnie pierw zajmujemy się obsługą kolizji potwora z bohaterem. Jak pamiętamy nasz bohater jest obecnie żółtym okręgiem, natomiast strzał to prostokąt. Nie możemy tych dwóch różnych figur porównać do siebie jak to robiliśmy wcześniej. Dlatego z rozwiązaniem przychodzi stworzenie pomocniczego prostokąta i tak też robimy w trzeciej linijce, nadając mu współrzędne początkowe równe środkowi koła pomniejszone o promień oraz długość i szerokość mnożąc promień razy 2. Teraz możemy sprawdzić czy zachodzi kolizja potworka z postacią gracza. Jeśli tak wtedy odejmujemy 10 punktów życia bohaterowi oraz usuwamy potworka.

W przypadku kolizji potworka z bazą jest już prościej, ponieważ mamy tu do czynienia z takimi samymi figurami. Dlatego sprawdzamy czy nachodzą na siebie, jeśli warunek jest prawdziwy następuje odjęcie 10 punktów życia bohatera i usunięcie potworka.

 

Kolizja strzały stworów – bohater/baza

Ostatnimi kolizjami jakimi dziś się zajmiemy to kolizje związane ze strzałami przeciwników trafiającymi w bohatera oraz bazę. W przypadku obu kolizji początkowo będziemy odejmować po 1 punkcie życia zarówno bohaterowi jak i bazie.

        for(Iterator<Shoot> it = strzalyPotworow.iterator(); it.hasNext();) {
            Shoot shoot = it.next();
            Rectangle rec = new Rectangle(player.x - player.radius, player.y - player.radius, player.radius * 2,player.radius * 2);
            if(shoot.overlaps(rec)){
                it.remove();
                player.setHp(player.getHp() - 1);
            }
            if(shoot.overlaps(baza)){
                it.remove();
                baza.setHp(baza.getHp() - 1);
            }
        }

Raz kolejny tworzymy iterator wzorowany na pierwszym, który opisałem z tym, że teraz będziemy iterować po liście strzalyPotworow. Tworzymy odwzorowanie okręgu reprezentującego postać naszego bohatera na prostokąt – podobnie jak miało to miejsce w poprzedniej kolizji. Następnie sprawdzamy czy strzał wystrzelony przez przeciwnika trafił w naszego bohatera, jeśli tak wtedy następuje usunięcie potworka oraz odjęcie 1 punktu życia naszemu bohaterowi.

Kolejną już ostatnią dziś kolizją jest kolizja strzału potworka z bazą. Sprawdzamy czy kolizja miała miejsce, jeśli zdarzenie zaszło, wtedy strzał zostaje usunięty, a bazie odjęty 1 punkt życia.

Efekt naszego dzisiejszego kodu.

 

Podsumowanie

Dziś udało nam się zrealizować podstawowe kolizje. Teraz można się już pobawić i zacząć walczyć z przeciwnikami, przemierzając mapę i zbijając je, cały czas pamiętając o tym, aby chronić bazę. Na dziś to wszystko, w następnym wpisie dodamy kolejne ciekawe funkcję. Gra powoli zaczyna nabierać kształtów.

Pozdrawiam,

sirmarbug

Podziel się ze znajomymi