Kiedy bohater spotka się z wrogiem

bugajsky.pl 7 lat temu

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, iż 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, iż 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żeli 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żeli 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 dzięki 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 w tej chwili żół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żeli 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żeli 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, iż 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żeli 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żeli 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 interesujące funkcję. Gra powoli zaczyna nabierać kształtów.

Pozdrawiam,

sirmarbug

Idź do oryginalnego materiału