Alien Breed V. - Map and Alien
Ciele
- Naučiť sa vytvoriť triedu podľa návrhového vzoru Factory method.
- Zopakovať si využívanie referencie objektu na samého seba prostredíctvom kľúčového slova this.
- 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.

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
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
- 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.
Ďalšie zdroje
- Návrhový vzor Factory method pattern na Wiki
- Tiled map editor
- Porovnávanie reťazcov String.equals()
$Id$