Alien Breed V. - Map and Alien

Ciele

  1. Naučiť sa vytvoriť triedu podľa návrhového vzoru Factory method.
  2. Zopakovať si využívanie referencie objektu na samého seba prostredíctvom kľúčového slova this.
  3. Zopakovať si vetvenie programu používaním switch.

Úvod

Úlohou dnešného cvičenia je včleniť hráča do mapky, rozmietniť na mapke jednotlivé predmety a zabepečiť, aby hráč neprechádzal cez steny a iné prekážky. Ak náhodou na vašom cvičení predošlý týždeň bolo avizované, že 10. cvičenie bude náročné, nemusíte sa obávať, je veľmi jednoduché ;)

Postup

Krok č. 1

V prvom kroku vytvoríte triedu, ktorá sa podobá na továreň. Bude slúžiť na výrobu actorov vo vašej hre. Nie je to špeciálny typ triedy z pohľadu objektovo orientovaného programovania, avšak jeden z návrhových vzorov, čiže spôsob ako riešiť problémy podobného druhu. Továreň bude mať iba jednu metódu, ktorá na základe parametra vytvorí potrebnú inštanciu actora. Napríklad ak je parametrom reťazec player vytvorí inštanciu triedy Player.

Úloha 1.1:

Stiahnite si novú verziu knižnice AlienLib.

Úloha 1.2:

Vytvorte novú triedu AlienBreedActorFactory v balíčku alien.actor. ktorá implementuje rozhranie ActorFactory.

Úloha 1.3:

V triede vytvorte metódu create() ktorá:
  • požaduje jeden parameter typu String
  • vracia objekt typu Actor

Úloha 1.4:

Metódu create() implementujte tak, aby na základe parametra vrátila novú inštanciu objektu typu Actor. Napríklad pre reťazec "player" vráti novú inštanciu triedy Player.
Zabezpečte aby továreň vytvárala všetky vami doteraz vytvorené objekty, ktoré dedia od triedy Actor, čiže:
  • Player: "player"
  • Energy: "energy"
  • Ammo: "ammo"
  • Fan: "fan"
  • Key: "key"
Poznámka:  Spôsob akým budete vyberať vhodné volanie vytvorenia novej inštancie závisí od verzie Javy, ktorú používate. V Jave 7 môžete použiť príkaz switch, v Jave 6 musíte použiť vetvenie if /else if / ... else. Na porovnávanie reťazcov v Jave nepoužívajte operátor = ale volanie metódy equals(). Pozrite si doplňujúce odkazy.

Úloha 1.5:

V triede Main v metóde main() vytvorte novú inštanciu triedy AlienBreedActorFactory.

Úloha 1.6:

Nastavte novovytvorený objekt továrne svetu volaním metódy setFactory() nad objektom world.
Poznámka:  Nastavenie továrne musíte realizovať ešte pred volaním metódy run() nad objektom sveta.

Krok č. 2

V tomto kroku vytvoríte najväčšiu zmenu vo výzore hry, ale budete pre to musieť naprogramovať naozaj málo. Nastavíte svetu mapku. Samotný framework sa už postará o vykreslenie pozadia, rozmiestnenie hráčov, predmetov, atď.

Úloha 2.1:

V triede Main v metóde main() nastavte mapku volaním metódy setMap() nad objektom sveta. Ako parameter použite zdrojový súbor mapky "resources/alien_breed_level_01_norm.tmx".
Poznámka:  Nastavenie mapky musí byť realizované až za nastavením továrne. Ak by to bolo opačne, pri spracovaní mapky by neexistoval mechanizmus na vytváranie actorov, ktorí sú definovaní v mapke.

Úloha 2.2:

V metóde main() zmažte kód, ktorý vytvára hráča a zvyšné predmety. Túto funkcionalitu za vás odteraz zabezpečí framework.

Úloha 2.3:

Overte správnosť riešenia spustením hry. Mali by odteraz vedieť chodiť po mapke a zbierať predmety. Zatiaľ sa budete pohybovať ako duch a steny pre vás nebudú tvoriť žiadne prekážky.
Obr.:Hráč na mapke.

Krok č. 3

V treťom kroku zabezpečíte, aby hráč neprechádzal cez steny. Musíte vyriešiť kolízie so stenou a neumožniť hráčovi zmeniť pozíciu, ak sa snaží dostať na miesto, kde sa nachádza prekážka. Zmeny sa budú týkať iba metódy act() v triede Player, preto nasledujúce úlohy implementujte v tejto metóde.

Úloha 3.1:

Uložte si pôvodnú pozíciu hráča do pomocných premenných ešte pred spracovaním vstupu od používateľa (reakcia podľa stlačenej klávesy).

Úloha 3.2:

Po spracovaní vstupu pridajte overenie, aby sa hráč posunul iba v prípade, ak sa neprekrýva so stenou.
  • nad atribútom sveta zavolajte metódu intersectWithWall()
  • ako parameter použije odkaz na objekt triedy, ktorú práve implementujete, čiže "samého seba"
  • ak sa hráč prekrýva so stenou nastavte pôvodné hodnoty pozície hráča

Krok č. 4

V poslednom kroku vytvoríte základ pre Aliena. Implementácia nepriateľa bude veľmi podobná ako samotného hráča. Taktiež sa bude pohybovať do štyroch smerov, avšak nie na základe stlačenej klávesy, ale náhodne. Ak si nebudete istý ako implmenetovať úlohy v tomto kroku nahliadnite do implementácie triedy Player.

Úloha 4.1:

Vytvorte novú triedu Alien v balíčku alien.actor.item. Trieda Alien dedí od triedy AbstractActor.

Úloha 4.2:

V triede vytvorte štyri atribúty pre animácie do štyroch rôznych smerov rovnako ako v triede Player.
Sú to:
  • leftAnimation
  • rightAnimation
  • upAnimation
  • downAnimation

Úloha 4.3:

Vytvorte konštruktor, ktorý nastaví príslušné animácie. Zdrojový obrázok, ktorý použijete pre aliena sa nachádza v súbore resources/images/alien.png. Pri nastavení zvyšných parametrov novej inštancie animácie, otočenia a nastavení striedania obrázkov v animácii postupujte rovnako ako v triede Player.

Úloha 4.4:

Pridajte v triede dva atribúty typu int:
  • generatedSteps
  • generatedRotation
Poznámka:  Atribút generatedSteps predstavuje počet krokov, ktoré pôjde alien v jednom smere. Atribút generatedRotation určuje smer, v ktorom sa bude alien pohybovať. Bude nadobúdať iba štyri rôzne hodnoty: 0, 90, 180, 270.

Úloha 4.5:

Vytvorte metódu generateMovement(), ktorá náhodne nastaví atribút generatedRotation na jedno z čísel: 0, 90, 180, 270 a atribút generatedSteps na číslo od 0 po 100.
Poznámka:  Pre generovanie náhodného pohybu použite objekt Random a jeho metódu nextInt().

Úloha 4.6:

Implementujte metódu act() nasledovne:
  • ak generatedSteps je rovné 0, vygenerujte nový pohyb volaním metódy generateMovement()
  • ak generatedRotation je rovné 0, zmeňte pozíciu a animáciu pre smer hore
  • ak generatedRotation je rovné 90, zmeňte pozíciu a animáciu pre smer vpravo
  • ak generatedRotation je rovné 180, zmeňte pozíciu a animáciu pre smer dole
  • ak generatedRotation je rovné 270, zmeňte pozíciu a animáciu pre smer vľavo
Na konci metódy znížte hodnotu atribútu generatedSteps o 1.
Poznámka:  Na implementáciu rozhodovania, ktorým smerom sa má alien vydať, použite vetvenie cez switch.

Úloha 4.7:

Upravte triedu AlienBreedActorFactory tak, aby podporovala vytvorenie aliena. Parameter metódy create(), ktorý určí vytvorenie novej inštancie aliena je "alien".

Krok č. 5

Doplňujúce úlohy

  1. Stiahnite si editor na úpravu mapiek Tiled map editor a upravte mapku priloženú v projekte. Upravenú mapku uložte vo formáte TMX a načítajte vo vašej hre.
$Id$