Dziś w przededniu Wielkanocy, zajmiemy się utworzeniem więcej niż jednego przeciwnika. Dotychczas po uruchomieniu gry naszym oczom ukazywał się jedynie jeden przeciwnik, który poruszał się według dwóch losowań, pierwsze odpowiadało za kierunek ruchu, natomiast drugie za ilość kroków wykonanych w danym kierunku. Teraz zmienimy to, aby maksymalnie było ich dziesięć i oraz, aby mogły wykonywać strzały w każdym kierunku świata. Oczywiście strzały przeciwników będą wykonywane niezależnie od innych przeciwników.
Na sam początek potrzebujemy listę potworków, a nie jak dotychczas było pojedynczą zmienną klasy Monster.
private LinkedList<Monster> potwory; //lista potworów
Wykorzystujemy do tego LinkedList abyśmy mogli usuwać w przypadku kolizji.
Następnie musimy w metodzie create zainicjalizować nową zmienną.
potwory = new LinkedList<Monster>();
Kolejną rzeczą jaką musimy zrobić to dodać kod rysujący każdego z wrogów, zatem zmiany wprowadzamy w metodzie render.
for (Monster m : potwory) { batch.draw(m.getTexture(), m.x, m.y); }
Mamy tu iterator, zrealizowany za pomocą pętli for. W nawiasie określamy klasę zmiennej, jej nazwę oraz po : wskazujemy na listę po której ma iterować (przechodzić przez każdy jej element). W pętli wykonujemy rysowanie w podobny sposób jak wcześniej tworząc pojedynczego przeciwnika, uwzględniając, że naszym pojedynczym potworkiem jest zmienna m.
Do podstawowej obsługi pozostało już tylko zrobienie poruszania oraz dodawania nowych potworków. Przechodzimy zatem do metody update, gdzie piszemy odpowiedzialny za to kod.
potwory.add(new Monster(r.nextInt(5000),r.nextInt(5000)));
Powyższa linijka odpowiada za dodanie nowego potworka o randomowych współrzędnych.
for (Monster m : potwory) { if (m.getMoveQuantity() > 0) { m.moveToBottom(); m.moveToLeft(); m.moveToRight(); m.moveToTop(); m.setMoveQuantity(m.getMoveQuantity() - 1); } else { m.generateMove(); m.moveToBottom(); m.moveToLeft(); m.moveToRight(); m.moveToTop(); m.setMoveQuantity(m.getMoveQuantity() - 1); } }
Masz wrażenie, że podobny kod już gdzieś widziałeś? To bardzo dobry znak, ponieważ jest to dokładnie ten sam warunek odpowiedzialny za poruszanie się naszego pojedynczego przeciwnika. Jedyna różnica, że teraz został umieszczony w iteratorze (taki sam iterator jak w przypadku rysowania potworków na ekranie) i odwołuję się do każdego wroga znajdującego się w liście potworków.
W tej chwili mamy kod odpowiedzialny za tworzenie oraz poruszanie się potworków po naszej planszy. Czas dodać naszym przeciwnikom pewne ograniczenia. Zajmiemy się ciągłym dodawaniem oraz maksymalną ilością przeciwników. Otóż w tej chwili co każdą klatkę pojawia się nam nowy przeciwnik, zmieńmy to tak, aby co 1s dochodził jeden przeciwnik oraz aby maksymalnie mogło być ich dziesięć. Musimy dodać nową zmienną typu float oraz zainicjalizować ją wartością . Będzie ona odpowiedzialna za mierzenie czasu pomiędzy dodaniem ostatniego, a obecnego wroga.
timerMonster += Gdx.graphics.getDeltaTime(); if(timerMonster > 1){ if(potwory.size() < 10) potwory.add(new Monster(r.nextInt(5000),r.nextInt(5000))); timerMonster = 0; }
Pierwsza linijka jest odpowiedzialna za dodanie różnicy czasu pomiędzy ostatnią, a obecną klatką do naszej zmiennej przechowującej czas. W chwili kiedy czas ten będzie większy od 1s, zostanie sprawdzony warunek czy obecna ilość potworków jest mniejsza niż 10, jeśli tak to zostaje dodany nowy potwór oraz czas zostaje wyzerowany.
Przyszedł czas na dodanie umiejętności naszym potworkom. Strzały będą tą umiejętnością, którą dziś dodamy (w przyszłości postaramy się jeszcze rozwinąć naszych wrogów). Zatem na początek dodajemy nową zmienną listową oraz inicjalizujemy ja w w podobny sposób jak robiliśmy to wcześniej.
private LinkedList<Shoot> strzalyPotworow; // lsita strzałów potworów
Następnie musimy napisać kod odpowiedzialny za rysowanie strzałów na ekranie.
for (Shoot s : strzalyPotworow) { batch.draw(s.getTexture(), s.x, s.y); }
Taka sama zasadza działania jak miało to miejsce przy rysowaniu potworków z listy. Teraz pozostaje już tylko dodać strzały do listy.
for (Monster m : potwory) { int l1 = r.nextInt(100); int l2 = r.nextInt(100); if(l1 == l2){ int kierunek = r.nextInt(4); strzalyPotworow.add(new Shoot(m.x + m.getTexture().getWidth() / 2 - 5, m.y + m.getTexture().getHeight() / 2 - 5, 1, kierunek)); } }
Aby uniknąć ciągłych strzałów, warunkiem dodania elementu do listy jest wylosowanie dwóch liczb takich samych z przedziału od 0 do 99. Jeżeli warunek jest spełniony następuje wylosowanie kierunku strzału oraz dodanie go do listy wszystkich strzałów.
Efekt naszej dzisiejszej pracy.
Podsumowanie
I tak dziś utworzyliśmy flotę wrogów, która może nas atakować strzałami. Oczywiście zastosowane rozwiązanie nie jest idealne, ale będziemy mogli dzięki niemu ruszyć w kolejnym wpisie dalej, tworząc różne kolizję i dodawać za nie punkt oraz odejmować życie. Wszystko powoli zaczyna układać się w jedną całość. Uruchamiając naszą grę można obserwować jak dochodzą nowi przeciwnicy oraz śledzić ich ruchy. Strzały oddawane są stosunkowo często co będzie pewnym utrudnieniem.