Alien Breed II. - Player
Ciele
- Naučiť sa implementovať rozhrania.
- Naučiť sa získať inštanciu triedy jedináčika (Singletonu).
- Naučiť sa využívať vývojové prostredie pre generovanie častí zdrojového kódu.
- Zopakovať si implementáciu metód, konštrutkora a vetvenie.
Úvod
Úlohou dnešného cvičenia je vytvoriť jednoduchý herný svet a hlavného hrdinu. Na konci cvičenia sa bude vedieť pohybovať po sivom plátne. Hrdina bude reagovať na stlačenie kurzorových šípok, ktoré udávajú smer jeho pohybu.
Postup
Krok č. 1
Keďže vytvárate aplikáciu s grafickým používateľským rozhraním,
v prvom kroku vytvoríte okno s čiernym pozadím a výpisom FPS
(frames per second) v pravom hornom rohu.
Úloha 1.1:
V metóde main() vytvorte novú inštanciu triedy SlickWorld
a referenciu uložte v lokálnej premennej.
Poznámka:
Typ lokálnej premennej deklarujte pomocou rozhrania. SlickWorld
implementuje rozhranie World, použite teda toto rozhranie.
Konštruktor požaduje tri parametre:
- názov okna - zadajte napr.: "Alien Breed"
- šírku okna v pixeloch - zadajte 800
- výšku okna v pixeloch - zadajte 600
Úloha 1.2:
Zavolajte metódu run() na vytvorenom objekte typu World.
Úloha 1.3:
Spustite výsledok svojej implementácie.
Hru spustíte pomocou menu Run => Run Project alebo stlačením klávesy F6.
Po spustení sa vám zobrazí okno aplikácie so sivou plochou a výpisom FPS v ľavom hornom rohu.
Obr.:Prázdne okno aplikácie.

Krok č. 2
V tomto kroku vytvoríte hráča so základnými atribútmi, metódami a zobrazíte ho do herného poľa. Hráč bude mať svoju polohu v rámci hracieho poľa danú x-ovou a y-ovou súradnicou a vlastnú animáciu. Keďže hra je 2D s pohľadom "zhora", hráč sa môže pohybovať iba do štyrok strán: vpravo, vľavo, hore, dole.
Úloha 2.1:
Vytvorte triedu Player, ktorá implementuje rozhranie Actor.
Triedu umiestnite do balíčka alien.actor. Implementujte rozhranie Actor vytvorením potrebných prázdnych metód.
Úloha 2.2:
Implementujte metódy rozhrania getX(), getY(), getAnimation(), setAnimation() a setPosition(), a vytvorte k nim príslušné členské premenné.
Bude sa jednať o nasledujúce atribúty:
- x-ová pozícia hráča
- y-ová pozícia hráča
- aktuálna animácia hráča
Úloha 2.3:
Implementujte metódy getWidth() a
getHeight() pre zistenie šírky a výšky animácie.
Jedná sa o výšku a šírku obrázka, ktorý sa zobrazí pri vykreslení (animácie) hráča.
Tieto hodnoty získate volaním príslušných get metód na atribúte
animation.
Úloha 2.4:
Vytvorte konštruktor triedy Player, v ktorom objekt hráča inicializujete.
Inicializácia pozostáva v nastavení aktuálnej animácie, ktorá bude hráča reprezentovať. Vytvorte preto novú animáciu s príslušnými parametrami:
Obr.:Sprity hráča otočeného smerom hore
- relatívna cesta k obrázku animácie - jednotlivé animácie pre hru nájdete v priečinku resources/images/player_n.png projektu
- výška obrázku - 32
- šírka obrázku - 32
- čas v milisekundách - 100

Poznámka:
Nad objektom animácie môžete zavolať metódu setPingPong(), pomocou ktorej zabezpečíte kontinuálne prehrávanie animácie spôsobom - od prvého obrázka po posledný a späť od posledného po prvý. V opačnom prípade sa animácia bude prehrávať od prvého obrázka po posledný.
Úloha 2.5:
Vytvorte inštanciu triedy Player v hlavnej metóde main() aplikácie,
nastavte jeho pozíciu na 100,100 a pridajte hráča do herného sveta zavolaním metódy addActor() nad objektom sveta.
Úloha 2.6:
Odstráňte telo metód act() a addedToWorld() a nechajte ich prázdne.
Metóda act() je najdôležitejšou metódou každého actora. V ďalšom kroku v nej implementujete podporu pre ovládanie hráča z klávesnice, v nasledujúcom module v nej budete riešiť kolízie s ďalšími actormi. V tomto kroku ju však necháte prázdnu. Podobne necháte prázdnu aj metódu addedToWorld().
Úloha 2.7:
Overte správnosť svojej implementácie.
Spustite hru. Ak ste postupovali správne, na obrazovke sa objaví hráč na sivej ploche orientovaný smerom na sever, ktorého však zatiaľ nie je možné ovládať.
Obr.:Hráč umiestnený na pozícii 100, 250 s animáciou nastavenou na smer hore/vpred.

Krok č. 3
V tomto kroku pridáte funcionalitu pre ovládanie hráča pomocou kurzorových kláves. Akákoľvek aktivita ktoréhokoľvek objektu typu Actor (čiže aj hráča) sa vykonáva v rámci metódy act(). Teraz v tejto metóde implementujete potrebný kód, ktorým bude možné reagovať na stlačené klávesy a následne pohybovať hráčom.
Úloha 3.1:
Získajte inštanciu triedy Input, ktorá je implementovaná pomocou návrhového vzoru jedináčik, pomocou statickej metódy getInstance() nad triedou Input.
Úloha 3.2:
Ukončite aplikáciu, ak hráč stlačí kláves ESCAPE.
Zistiť stlačený kláves je možné volaním metódy isKeyDown(). Parametrom metódy je kód klávesy, ktorej stlačenie sa pokúšate zistiť (kód klávesy ESCAPE je Input.Key.ESC). Hru môžete ukončit natvrdo zavolaním metódy System.exit(0);.
Úloha 3.3:
Overte správnosť svojej implementácie.
Ak ste postupovali správne, po stlačení klávesu ESCAPE sa aplikácia ukončí.
Úloha 3.4:
Zistite, či bol stlačený kurzorový kláves hore (šípka hore) - ak áno, presuňte hráča smerom hore.
Po zistení stlačeného klávesu (kód klávesy Input.Key.UP zmeňte aktuálnu pozíciu hráča - hodnotu jeho y-ovej súradnice. Ako pomôcku si môžete v triede hráča vytvoriť konštantu STEP, ktorá bude reprezentovať veľkosť posunutia hráča.Jej hodnotu môžete inicializovať podľa potreby napr. na 2 pixle.
Úloha 3.5:
Overte správnosť svojej implementácie.
Ak ste postupovali správne, po stlačení kurzorovej šípky hore sa hráč rozbehne na obrazovke smerom hore. V závislosti od aktuálnej hodnoty členskej premennej y môže hráč z obrazovky zmiznúť.
Úloha 3.6:
Upravte zobrazovanie hráčovej animácie tak, aby sa jeho animácia nepremietala, ak stojí.
Nad objektom animácie je možné volať dve metódy:
- start() - pomocou tejto metódy je možné animáciu spustiť, a
- stop() - pomocou tejto metódy je možné animáciu zastaviť.
Úloha 3.7:
Podobným spôsobom implementujte ovládanie hráča do zvyšných smerov - vľavo, vpravo a dolu.
Pre splnenie tejto úlohy najprv vytvorte atribúty leftAnimation, rightAnimation, upAnimation, downAnimation, ktoré budú reprezentovať animáciu hráča pri pohybe v smere vľavo, vpravo, hore a dolu a inicializujte ich v konštruktore na príslušné hodnoty. Následne upravte metódu act(), v ktorej nastavíte aktuálnu animáciu na jednu z týchto uvedených štyroch na základe hráčom stlačenej klávesy.
Úloha 3.8:
Overte správnosť svojej implementácie.
Ak ste postupovali správne, váš hráč by mal reagovať na stlačenie všetkých štyroch kláves, po ktorých stlačení by sa mal otočiť daným smerom a jeho animácia by sa mala prehrávať len vtedy, keď kláves na ovládanie smeru jeho pohybu držíte.
Obr.:Pohybujúci sa hráč všetkými smermi

Krok č. 4
Doplňujúce úlohy
- Pridajte podporu pre stlačenie dvoch kláves naraz, konkrétne LEFT a RIGHT. Ak hráč bude držať tieto klávesy, hrdina bude behať po uhlopriečke, od ľavého horného rohu k pravému dolnému rohu a naspäť.
- Pridajte podporu pre stlačenie dvoch kláves naraz, konkrétne UP a DOWN. Ak hráč bude držať tieto klávesy, hrdina bude behať do štvorca.
-
Upravte ovládanie hráča nasledovne:
- po stlačení šípky hore sa hráč bude pohybovať dopredu
- po stlačení šípky doľava sa hráč otočí o príslušný počet stupňov vľavo
- po stlačení šípky doľava sa hráč otočí o príslušný počet stupňov vpravo
Ď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$