Alien Breed IV. - Backpack
Ciele
- Naučiť sa pracovať s dynamickým kolekciami (List, ArrayList).
- Naučiť sa využívať generické typy.
- Naučiť sa využiť kľúčové slovo super, pri volaní metódy predka pri preťažení metódy v potomkovi.
- Naučiť sa generovať náhodné čísla.
Úvod
Úlohou dnešného cvičenia je vytvoriť batoh, do ktorého bude možné ukladať vyzbierané predmety. Pri implementácii využijete generické typy. V rámci tohto cvičenia vytvoríte aj ďalšie predmety.
Postup
Krok č. 1
V prvom kroku vytvoríte batoh, ktorý bude poskytovať tri metódy:
- add(Item e) - pridanie predmetu do Batoha
- iterator() - získate iterátor k predmetom v batohu
- remove(Item item) - odstráni predmet z batoha
Úloha 1.1:
Vytvorte novú triedu LargeBackpack v balíčku alien.actor.
ktorá implementuje rozhranie Backpack.
Úloha 1.2:
V triede vytvorte atribút items reprezentujúci zoznam predmetov nachádzajúcich sa v batohu.
Zoznam nech je reprezentovaný pomocou generickej kolekcie List.
Využite implementáciu listu ArrayList. Nezabudnite deklarovať dynamický zoznam
ako generický List<Item>, keďže viete, že v zozname sa budú nachádzať
iba predmety typu ArrayList
Poznámka:
List je rozhranie, ktoré definuje základné metódy pre
všetky dynamické kolekcie ako napríklad add(), get(),
remove(), size() a pod.
Existuje viacero implementácii tohto rozhrania: ArrayList alebo
LinkedList. Pre viac informácií pozrite doplňujúce zdroje.
Úloha 1.3:
Implementujte metódy rozhrania Backpack nasledovne:
- add(Item e) - pridá predmet do listu items
- iterator() - získa z listu items iterátor
- remove(Item item) - odstráni predmet z listu
Poznámka:
Použite metódy s rovnakým menom na objekte typu List.
Úloha 1.4:
V triede Player pridajte atribút items, ktorý bude typu
Backpack a priradte mu inštanciu triedy LargeBackpack.
Úloha 1.5:
Implementujte (preťažte) metódu addedToWorld(World world) v triede Player nasledovne:
- najprv zavolajte preťaženú metódu predka, čiže triedy AbstractActor pomocou kľúčového slova super
- pridajte batoh svetu prostredníctvom metódy showBackpack() nad objektom sveta
Úloha 1.6:
Upravte súradnice výpisu úrovne energie aby sa zobrazovala v hornej časti obrazovky a neprekrývala
s obsahom batohu.
Pozíciu nastavte na 140, 10.
Poznámka:
Ak ste zabudli kde presne ste vytvorili a nastavili výpis energie, pozrite si úlohu 4.4
v predošlom cvičení.
Úloha 1.7:
Overte správnosť svojej implementácie.
Ak ste postupovali správne, mal by sa vám zobraziť čierny pruh na spodnej strane okna.
Zatiaľ nebude obsahovať žiadne predmety.
Obr.:Prázdny batoh na spodnej strane okna.

Krok č. 2
Pravdepodobne ste si všimli, že do batohu je možné pridávať iba veci typu
Item. Zatiaľ nemáte vytvorený žiaden predmet, ktorý by implementoval
toto rozhranie. Trieda Energy dedí od abstraktnej triedy
AbstractActor, ktorá implementuje rozhranie Actor,
nie však Item. V tomto kroku vytvoríte nový predmet
Key, ktorý bude možné pridať do batohu a logiku. Taktiež zabezpečíte,
aby sa predmet pridal do batohu iba ak sa pozícia hráča prekrýva s pozíciou predmetu.
Úloha 2.1:
Vytvorte novú triedu Key v balíčku alien.actor.item, ktorá bude dediť od abstraktnej
triedy AbstractActor a bude implementovať rozhranie Item.
Poznámka:
Rozhranie Item je prázdne, neobsahuje žiadnu metódu.
Úloha 2.2:
Vytvorte konštruktor triedy Key, v ktorom inicializujete
aktuálnu animáciu pre tento predmet.
inicializácia pozostáva z vytvorenia novej animácie s príslušnými parametrami:
- relatívna cesta k obrázku animácie resources/images/key.png
- výška obrázku: 16
- šírka obrázku: 16
- čas v milisekundách: 10
Úloha 2.3:
Implementujte metódu act() v triede Key nasledovne:
- získajte inštanciu hráča
- ak sa pozícia kľúča prekrýva s pozíciou hráča, pridajte predmet do batohu a odoberte predmet zo sveta
Poznámka:
Pri určení prekrytia pozície hráča s pozíciou predmetu využite metódu intersect()
podobne ako v triede Energy.
Úloha 2.4:
V metóde main() vytvorte niekoľko predmetov Key.
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.5:
Overte správnosť svojej implementácie.
Ak ste postupovali správne, môžete pozbierať zopár kľúčov, ktoré sa vám následne zobrazia
v batohu v spodnej časti okna.
Obr.:Hráč a pozbierané kľúče v batohu.

Krok č. 3
V poslednom kroku vytvoríte ďalšie dva predmety. Jedným z nich sú náboje, ktoré hráč zatiaľ bude vedieť
iba vložiť do batohu, ale inak ich nevyužije, pretože nemáte nepriateľov. Druhý predmet je ventilátor,
ktorý nie je prenositeľný, neskôr sa stane súčasťou mapky.
Úloha 3.1:
Vytvorte novú triedu Fan v balíčku alien.actor.item, ktorá bude dediť od abstraktnej
triedy AbstractActor. Keďže ventilátor nie je prenositeľný, nebude implementovať rozhranie
Item.
Úloha 3.2:
Vytvorte konštruktor triedy Fan, v ktorom inicializujete
aktuálnu animáciu pre tento predmet.
inicializácia pozostáva z vytvorenia novej animácie, ktorá sa nastaví atribútu
animation s príslušnými parametrami:
- relatívna cesta k obrázku animácie resources/images/fan.png
- výška obrázku: 32
- šírka obrázku: 32
- čas v milisekundách: náhodná hodnota v intervale <400, 800>
Poznámka:
Na získanie náhodného čísla využite inštanciu triedy Random
a jej metódy nextInt().
Úloha 3.3:
Vytvorte novú triedu Ammo v balíčku alien.actor.item, ktorá bude dediť od abstraktnej
triedy AbstractActor. Keďže zatiaľ nemáte žiadnu zbraň a neviete náboje využiť, trieda bude
implementovať rozhranie Item.
Úloha 3.4:
Vytvorte konštruktor triedy Ammo, v ktorom inicializujete
aktuálnu animáciu pre tento predmet.
inicializácia pozostáva z vytvorenia novej animácie, ktorá sa nastaví atribútu
animation s príslušnými parametrami:
- relatívna cesta k obrázku animácie resources/images/ammo.png
- výška obrázku: 16
- šírka obrázku: 16
- čas v milisekundách: 10
Úloha 3.5:
Implementujte metódu act() v triede Ammo rovnako ako v triede
Key.
Úloha 3.6:
V metóde main() vytvorte niekoľko predmetov Fan a niekoľko predmetov
Ammo.
Nastavte im rôzne pozície prostredníctvom metódy setPosition() a pridajte ich svetu
volaním metódy addActor() nad objektom sveta.
Úloha 3.7:
Overte správnosť svojej implementácie.
Ak ste postupovali správne, môžete zbierať kľúče a náboje, ktoré sa vám následne zobrazia
v batohu v spodnej časti okna. Ventilátory nebude možné zobrať.
Obr.:Hráč, predmety v batohu a ventilátor.

Krok č. 4
Doplňujúce úlohy
- Vytvorte v triede Main metódu pre náhodné rozmiestnenie kľúčov. Parametrom metódy je počet kľúčov, ktoré majú byť vytvorené. Zabezpečte aby vytvorené lekárničky neboli mimo okna hry.
- Upravte metódu pre náhodné rozmiestnenie kľúčov tak, aby bola generická, čiže spoločná pre všetky typy actorov. Pre tento účel potrebujete pridať ešte jeden parameter typu Class, ktorý bude generický pre objekty dediace od triedy Actor. Novú inštanciu vytvoríte volaním metódy newInstance() nad objektom triedy Class. Pre splnenie úlohy si dôkladne naštudujte doplnkovú literatúru.
Ďalšie zdroje
- Rozhranie List
- Dynamické pole ArrayList
- Trieda Random
- Generika - tutoriál
- Použitie kľúčového slova super
$Id$