Alien Breed IV. - Backpack

Ciele

  1. Naučiť sa pracovať s dynamickým kolekciami (List, ArrayList).
  2. Naučiť sa využívať generické typy.
  3. Naučiť sa využiť kľúčové slovo super, pri volaní metódy predka pri preťažení metódy v potomkovi.
  4. 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
Aby ho hráč mohol používať, musíte pridať referenciu na batoh do triedy Player a na správnom mieste sprítupniť zobrezenie obsahu batoha v používateľskom rozhraní.

Ú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

  1. 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.
  2. 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.
$Id$