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 !

Podobne dokumenty