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