Alien Breed III. - Items
Ciele
- Zopakovať si implementáciu abstraktných tried.
- Naučiť sa identifikovať kód, ktorý je spoločný pre skupinu tried (implementovaný v predkoch) a špecifický (implementovaný v potomkoch).
- Naučiť sa pretypovať objekt.
Úvod
Úlohou dnešného cvičenia je vytvoriť predmety, ktoré bude hráč môcť zobrať, ak príde na pozíciu daného predmetu.
Postup
Krok č. 1
Predmet, rovnako ako hráč, je určený pozíciou (x, y), má vlastnú animáciu a bude reagovať
s okolím prostredníctvom metódy act(). Pozícia, animácia atď. sú aj vlastnosti
triedy Player, ktorú ste implementovali na predošlom cvičení. Aby ste nemuseli
spoločné vlastnosti a metódy pre hráča a predmet implementovať dvakrát, implementujete najprv spoločnú
abstraktnú triedu AbstractActor.
Úloha 1.1:
Vytvorte novú abstraktnú triedu AbstractActor v balíčku alien.actor.
Trieda bude dediť od rozhrania Actor.
Úloha 1.2:
Implementujte všetky metódy rozhrania Actor.
Poznámka:
Aby ste si zjednodušili prácu, stačí ak skopírujete potrebné atribúty a metódy z triedy Player.
Rozlišujte čo je špecifické pre triedu Player a čo je spoločné pre všetkých Actor-ov !
Úloha 1.3:
Atribúty v absktraktnej triede AbstractActor deklarujte ako protected.
Úloha 1.4:
Metódu act() deklarujte ako abstraktnú.
Úloha 1.5:
Implementujte metódu addedToWorld(), ktorá nastaví atribút world
na hodnotu predanú parametrom.
Úloha 1.6:
Triedu Player upravte tak, aby dedila od triedy AbstractActor, vďaka čomu implementuje rozhranie
Actor, ako je to teraz.
Úloha 1.7:
Odstráňte v triede Player všetky metódy a atribúty, ktoré sú už implementované v triede AbstractActor
a ponechajte iba špecifické časti.
Krok č. 2
Ako prvý predmet vytvoríte lekárničku, ktorá sa hráčovi určite zíde, keď bude musieť bojovať s nepriateľom.
Úloha 2.1:
Vytvorte novú triedu Energy v balíčku alien.actor.item, ktorá bude dediť od abstraktnej
triedy AbstractActor.
Metódu act() zatiaľ ponechajte prázdnu. Odstráňte z nej vyhodenie výnimky
UnsupportedOperationException, pretože ak ju ponecháte hra vám spadne počas behu.
Úloha 2.2:
Vytvorte konštruktor triedy Energy, v ktorom objekt hráča inicializujete.
Inicializácia pozostáva z nastavenia aktuálnej animácie, ktorá reprezentuje predmet Energy.
Vytvorte preto novú animáciu s príslušnými parametrami:
- relatívna cesta k obrázku animácie resources/images/energy.png
- výška obrázku - 16
- šírka obrázku - 16
- čas v milisekundách - 10
Úloha 2.3:
V metóde main() vytvorte niekoľko predmetov Energy.
Nastavte im rôzne pozície prostredníctvom metódy setPosition() a pridajte ich svetu
volaním metódy addActor() nad objektom sveta.
Úloha 2.4:
Overte správnosť svojej implementácie.
Ak ste postupovali správne, na hracom plátne by malo byť rozmietnených zopár lekárničiek.
Obr.:Hráč a lekárničky rozmiestnené po hracej ploche

Krok č. 3
Keďže zatiaľ ste neimplementovali batoh ani stavový riadok, predmet iba zmizne z plátna, ak ho hráč zoberie.
Pre tento účel musíte implementovať metódu intersect(), ktorá zistí či hráč a predmet sa
prekrývajú. Aby pre hráča a pre každý predmet bolo možné zistiť či sa prekrýva s iným predmetom,
metódu intersect() implementujete priamo v trieda AbstractActor.
Implementácia je možná dvoma spôsobmi:
- priamou implementáciou algoritmu, ktorý zistí prekrytie dvoch obdĺžnikov
- využitím triedy Rectangle2D, ktorá je súčasťou Java Development Kit a poskytuje metódu intersect()
Úloha 3.1:
V metóde intersect() v triede AbstractActor
implementujte algoritmus, ktorý zistí, či dva obdĺžniky ohraničujúce sprity sa prekrývajú.
Na implementáciu využite pseudoalgoritmus:
Obr.:Prekrytie obdĺžnikov ohraničujúcich sprite
x < a + w && y < b + h && a < x + width && b < y + heightkde x, y sú súradnice pravého horného rohu jedného obdĺžnika a a, b druého obdĺžnika. Pozíciu, šírku a výšku actora viete získať prostredníctvo metód getX(), getY(), getWidth() a getHeight().

Úloha 3.2:
Ak sa vám nepáči prvý spôsob, implementujte algoritmus zisťujúci prekrytie obdĺžnikov pomocou triedy
Rectangle2D.Float a jej metódy intersect().
Vytvorte novú inštanciu triedy
Rectangle2D.Float, ktorá reprezentuje obdĺžnik okolo hráča alebo predmetu.
Konštruktor požaduje štyri parametre:
- x-ová pozícia (ľavý horný roh): daná pozíciou hráča
- y-ová pozícia (ľavý horný roh): daná pozíciou hráča
- šírka obdĺžnika: daná šírkou animácie
- výška obdĺžnika: daná výškou animácie
Poznámka:
Z triedy Rectangle2D nie je možné vytvoriť inštanciu priamo. Viete vytvoriť inštanciu
iba vnorených tried Rectangle2D.Float alebo Rectangle2D.Double.Vnoreneé triedy
určujú aký typ je použitý na reprezentáciu obdĺžnika. Inštanciu vytvoríte štandardne volaním
Vytvorte rovnaký objekt obdĺžnika pre objekt actor, ktorý je parametrom metódy
intersect() v triede AbstractActor.
Zistite či sa tieto dva obdĺžniky prekrývajú. Realizujete to volaním metódy intersects()
na jednom z obdĺžnikov. Druhý obdĺžnik použijete ako parameter tejto metódy.
new Rectangle2D.Float(...)
Úloha 3.3:
Hodnotu, ktorú ste získali, použite ako návratovú hodnotu aktuálne vytváranej metódy.
Krok č. 4
Aby hráč mohol zbierať lekárničky, potrebujete implementovať metódu act() v triede
Energy. Ak pozícia hráča sa prekrýva s pozíciou lekárničky, odoberiete lekárničku z herného sveta
a zvýšite úroveň energia hráčovi. Pridáte taktiež výpis aktuálnej úrovne energie hráča.
Úloha 4.1:
V triede Player pridajte atribút energy a vytvorte k nemu
prístupové metódy getEnergy() a setEnergy().
Úloha 4.2:
V triede Player vytvorte konštantu (fianálny statický atribút) ENERGY
a nastavte ho na 100. Atribút energy nastavte na túto konštantu.
Úloha 4.3:
Implementujte metódu act() v triede Energy nasledovne:
- zistite, či sa pozícia lekárničky prekrýva s pozíciou hráča volaním metódy intersect()
- ak sa pozície prekrývajú odoberte hráča zo sveta volaním metódy removeActor() nad objektov sveta
- ak sa pozície prekrývajú taktiež zvýšte energiu hráča volaním metódy setEnergy() na objekte hráča o 10
Poznámka:
Objekt hráča musíte pretypovať na Player, pretože getPlayer()
vracia objekt typu Actor, ktorý neobsahuje metódu setEnergy().
Úloha 4.4:
Zabezpečte výpis energie hráča v metóde act() triedy Player:
- vytvorením nového objektu triedy Message, ktorej konštruktor požaduje tri parametre: správu, x-ovú pozíciu a y-ovú pozíciu
- pozíciu správy nastavte na ľavý dolný roh okna čiže: 10, 380
- vypíšte správu volaním metódy showMessage() na objekte world
Úloha 4.5:
Overte správnosť svojej implementácie.
Ak ste postupovali správne, váš hráč by mal vedieť zbierať lekárničky, čím sa mu bude zvyšovať energia.
Obr.:Zobrazenie energy hráča

Krok č. 5
Doplňujúce úlohy
- Vytvorte v triede Main metódu pre náhodné rozmiestnenie lekárničiek. Parametrom metódy je počet lekárničiek, ktoré majú byť vytvorené. Zabezpečte aby vytvorené lekárničky neboli mimo okna hry.
Ďalšie zdroje
- Kostra projektu AlienBreed pre windows a linux
- Nástroj PMD
- Zoznam pravidiel pre nástroj PMD
- JavaDoc dokumentácia knižnice
- Rudolf Pečinovský: Rozhrania
- Rudolf Pečinovský: Balíčky
- Posledná verzia knižnice AlienLib
$Id$