po1011_egz_popr_Resc..
Transkrypt
po1011_egz_popr_Resc..
Egzamin poprawkowy z Programowania obiektowego, 2011-08-29 W grze “Rescue Avaj” pomagamy mieszkańcom krainy Avaj, którzy popadli w tarapaty. Znajdujące się w niedostępnych górach kryształy, które od wieków zapewniały w Avaj zdrowie, spokój i dobrobyt, zostały deaktywowane przed podstępnego maga. Nadworny jasnowidz króla Avaj stwierdził, że mag ów obudował kryształy rozmaitymi konstrukcjami, przez co przestało do nich docierać światło słoneczne pozwalające generować dobroczynną energię. Strapienie króla było ogromne, lecz na szczęście mędrcy znaleźli sposób na zniszczenie konstrukcji maga i reaktywację kryształów. Wpadli oni na pomysł zbudowania gigantycznej procy, która pozwala wystrzeliwać pociski na bardzo duże odległości - w niedostępne rejony gór kryjące kryształy - i w ten sposób niszczyć konstrukcje maga. Dodatkowo, opracowali magiczne pociski pozwalające na efektywne niszczenie nawet najwymyślniejszych konstrukcji. Gracz wciela się w generała króla, który ma za zadanie wykorzystać te wynalazki w praktyce i przywrócić moc kryształów. Kryształ jest kamieniem o kształcie wielkiego oszlifowanego diamentu, solidnie tkwiącym w skalistym podłożu. Kryształ zostaje odsłonięty, jeśli nie leżą na nim żadne bryły lub między leżącymi na nim bryłami jest szpara pozwalają na dotarcie do kryształu promienia słońca. Góry w krainie Avaj są z granitu zaś ich kształt może być skomplikowany. Konstrukcje zbudowane przez podstępnego maga składają się z elementów o różnym kształcie, wielkości i masie. Elementy te mogą być ponadto wykonane z różnych materiałów: lodu, piaskowca, granitu. Do zniszczenia konstrukcji, gracz ma do dyspozycji kilka pocisków różnego rodzaju (o tym za chwilę), które muszą być użyte w określonej kolejności. Po wystrzeleniu z procy pocisk może uderzać w przeszkody (np. skałę gór, elementy konstrukcji maga lub kryształy), które może przenikać, przemieszczać, niszczyć, odbijać się od nich lub samemu ulec zniszczeniu. Jeśli graczowi udało się odsłonić wszystkie kryształy, gra kończy się wygraną. W przeciwnym przypadku, jeśli pozostały jeszcze jakieś pociski, gracz może wystrzelić kolejny, tym samym kontynuując grę. Jeśli zaś nie ma już pocisków do wystrzelenia, gra kończy się przegraną. W grze istnieją trzy rodzaje pocisków, każdy o innych właściwościach fizycznych i magicznych (specjalnych). Właściwości specjalne pocisku mogą być aktywowane przez gracza dopiero po wystrzeleniu (w trakcie lotu). Dla danego pocisku, jego właściwość magiczna może być aktywowana co najwyżej raz. Pocisk standardowy jest w kształcie średniej kuli, ma średnią masę i nie ma właściwości magicznych. ● Pocisk kasetowy ma kształt dużego sześcianu, dużą masę, zaś w momencie aktywowania zdolności specjalnej, ulega zniszczeniu wyrzucając trzy identyczne standardowe pociski (o tej samej pozycji). Jeden z trzech nowych pocisków ma taką samą prędkość i kierunek jak pocisk kasetowy. Pozostałe dwa mają taką samą prędkość, ale ich kierunki lotu różnią się odpowiednio o +10 stopni i -10 stopni od ● kierunku lotu pocisku kasetowego. ● Pocisk penetrujący jest małym stożkiem i ma niewielką masę, lecz w momencie aktywowania zdolności specjalnej jego prędkość rośnie dwukrotnie. Pociski, proca, elementy konstrukcji maga, kryształy oraz skała to byty podlegające prawom fizyki. W szczególności, pocisk ma określoną pozycję w świecie gry (dotyczy jego środka ciężkości) oraz aktualną prędkość, działa na niego siła grawitacji, itd. Dodatkowo, gracz może wpływać na pocisk wystrzeliwując go z procy pod różnym kątem lub aktywując jego zdolności specjalne. Symulacją fizyki i interakcji z graczem zajmuje się silnik gry, a dokładniej jego metoda symulujFizykę(double kwant). Jako ilustracja, poniżej przedstawiono główną pętlę gry: while (!czyKoniec) { long aktualnyCzas = System.currentTimeInMillis(); double kwantDoZasymulowaniaWSek = (double)(aktualnyCzas - poprzedniCzas) / 1000.0; czyKoniec = silnik.symulujFizykę(kwantDoZasymulowaniaWSek); silnik.rysujAktualnyStan(); poprzedniCzas = aktualnyCzas; } Zadaniem metody symulujFizykę(double kwant) jest więc zmiana pozycji, prędkości i stanu pocisków, procy, elementów konstrukcji maga, itp. w czasie kwant, który upłynął od ostatniej symulacji, uwzględniając także działania gracza. Do poprawnego działania metoda ta potrzebuje informacji o wszystkich symulowanych pociskach, elementach konstrukcji, itd. Pierwszym interesującym aspektem metody symulujFizykę są wzajemne interakcje pocisków, elementów konstrukcji maga, itd. - tak zwane kolizje. Rozważmy pocisk i element konstrukcji. Metoda symulujFizykę na podstawie kształtu i pozycji obu tych bytów jest w stanie stwierdzić czy nastąpiła kolizja. W przypadku kolizji wywoływana jest prywatna metoda silnika symulujKolizję, której zadaniem jest uaktualnienie pozycji i stanu kolidującego pocisku i elementu konstrukcji. Obecnie strategia obsługi różnych kolizji wygląda następująco: ● ● ● ● ● ● Masa góry i kryształu jest nieskończona, więc jej prędkość po kolizji zawsze wynosi 0. Dowolny pocisk w zderzeniu z górą lub kryształem ulega natychmiastowemu zniszczeniu. Proca nie koliduje z innymi bytami (jest ona przenikalna). Jej prędkością jest zawsze 0. Pocisk załadowany do procy także nie koliduje z innymi bytami do momentu wystrzelenia. Lodowy element konstrukcji jest kruchy, więc ulega natychmiastowemu zniszczeniu w kolizji z jakimkolwiek bytem świata gry: dowolnym pociskiem, dowolnym elementem konstrukcji, górą. Prędkość zderzającego się bytu nie ulega zmianie. Piaskowcowy element konstrukcji ma pewną wytrzymałość, tj. maksymalną ilość energii, jaką może zaabsorbować. Po zderzeniu z innym bytem świata gry absorbuje do 1/4 sumy energii kinetycznej swojej i zderzającego się z nim bytu. Jeśli ilość zaabsorbowanej energii przekracza wytrzymałość, to ulega natychmiastowemu zniszczeniu. W przeciwnym przypadku, sytuacja zależy od bytu, z którym piaskowcowy element konstrukcji się zderza. Jeśli tym bytem jest pocisk penetrujący, to kierunek ruchu pocisku oraz elementu konstrukcji nie ulegają zmianie. W przeciwnym przypadku, element konstrukcji odbija się od zderzającego się z nim bytu zgodnie z prawami fizyki. ● Granitowy element element konstrukcji jest bardzo wytrzymały i nigdy nie ulega zniszczeniu. Pociski standardowe i kasetowe uderzające o elementy granitowe ulegają zniszczeniu. Pociski penetrujące odbijają się zgodnie z prawami fizyki. Pozostałe byty (elementy konstrukcji) kolidują jak wyżej. ● Pociski w zderzeniu ze sobą się odbijają. Drugim interesującym aspektem są działania gracza, a dokładniej metody prywatne silnika gry pociskWystrzelony i specjalnaZdolnośćPociskuAktywowana. Metoda pociskWystrzelony jest wywoływana na skutek wystrzelenia przez gracza pocisku, w momencie, gdy pocisk opuszcza już procę (pocisk ma już ustaloną pozycję i prędkość). Jej zadaniem jest rozpoczęcie w silniku gry symulacji ruchu pocisku. Metoda specjalnaZdolnośćPociskuAktywowana jest z kolei wywoływana, gdy gracz aktywuje specjalną zdolność danego pocisku. Jej zadaniem jest obsługa tej zdolności. Polecenie: 1. Zaprojektuj hierarchię klas dla opisanej powyżej gry. Pamiętaj o uwzględnieniu w projekcie wymienionych w treści zadania metod silnika gry i określeniu ich sygnatur. 2. Zaimplementuj metody silnika gry pociskWystrzelony i specjalnaZdolnośćPociskuAktywowana. 3. Zaimplementuj metodę symulujKolizję silnika gry. Wolno pominąć szczegóły obsługi wszystkich kolizji oprócz: ● kolizji pocisku standardowego z piaskowcowym elementem konstrukcji oraz ● kolizji pocisku penetrującego z lodowym elementem konstrukcji. Zwróć uwagę na obiektowość swojego rozwiązania. Wskazówki: ● ● Energia kinetyczna ciała stałego wyraża się wzorem Ek = 0.5 * m * |v|2, gdzie m to masa ciała, a |v| to wartość skalarna prędkości. Jako uproszczenie, możesz założyć, że do obliczania prędkości po odbiciu istnieje publiczna metoda statyczna obliczPrędkośćPoOdbiciu klasy Fizyka. Metoda ta przyjmuje dwie pary (masa1, prędkość1) oraz (masa2, prędkość2) dla kolidujących ciał a zwraca parę (nowaPrędkość1, nowaPrędkość2). Uwaga: prędkości przekazane do tej metody powinny być przeskalowane w przypadku kolizji z absorbcją energii kinetycznej. Powodzenia !