Alien Breed VI. - Dangerous aliens
Ciele
- Naučiť sa pracovať s enumeračným typom.
- Naučiť sa používať cyklus foreach v programovacom jazyku Java.
- Naučiť sa iterovať cez objekty, ktoré implementujú rozhranie Iterable.
Úvod
Na dnešnom cvičení zmeníte súčasný projekt na naozajstnú hru. Alieni prestanú prechádzať cez steny a stanú sa pre hráča nebezpečnými. Úlohou hráča nie je uniknúť iba formou prekážkového behu, preto mu umožníte zbaviť sa alienov ich zastrelením.
Postup
Krok č. 1
V prvom kroku dokončíte implementáciu aliena, aby neprechádzal cez steny a uberal hráčovi energiu
pri ich stretnutí. Spôsob ako zamedziť prechádzať alienovi cez steny je veľmi podobný ako u hráča,
inšpirujte sa preto predošlým cvičením. Implementácia tohto kroku pozostáva z viacerých úprav metódy
act() v triede Alien.
Úloha 1.1:
Implementujte kolíziu aliena so stenou rovnako ako u hráča.
Implementácia pozostáva z nasledujúcich krokov:
- uloženie pôvodnej pozície
- zmena pozície na základe vygenerovanej rotácie (realizované na predošlom cvičení)
- ak sa alien prekrýva so stenou, nastavte pôvodnú pozíciu
- ak sa alien prekrýva so stenou, vygenerujte nový pohyb
Úloha 1.2:
Odoberte hráčovi jeden bod z energie, ak sa alien prekrýva s hráčom.
Na zistenie prekrytia hráča s alienom použite metódu intersects().
Počet bodov, ktoré sa odoberú hráčovi z energie deklarujte ako konštantu v triede Alien.
Poznámka:
Hráča získaného zo sveta nezabudnite pretypovať na Player, pretože Actor
neobsahuje metódy getEnergy() a setEnergy().
Úloha 1.3:
Overte správnosť riešenia spustením hry. Hráčovi by mala byť pri stretnutí s alienom znížená energia.
Momentálne môže ísť aj do záporných čísel.

Krok č. 2
V duhom kroku necháte hráča zomrieť, ak úroveň jeho energie klesne na hodnotu 0.
Potrebujete vytvoriť nového aktora reprezentujúceho mŕtveho hráča. V prípade klesnutia energia
na úroveň 0, bude pôvodný hráč vymenený za nového aktora.
Úloha 2.1:
Vytvorte novú triedu DyingPlayer v balíčku alien.actor.
ktorá dedí od triedy AbstractActor.
Úloha 2.2:
V triede deklarujte jeden atribút explodedTime typu int,
ktorý určuje dĺžku animácie a nastavte ho na 10.
Úloha 2.3:
V triede vytvorte nový bezparametrický konštruktor ktorý nastaví animáciu s parametrami:
- obrázok animácie - "resources/images/player_die.png"
- výška animácie - 32
- šírka animácie - 32
- čas v milisekundách - 30
Úloha 2.4:
Preťažte konštruktor s dvoma parametrami typu int: x a
y.
Konšturktor v tele vykoná dve operácie:
- zavolá bezparametrický konšturktor
- nastaví pozíciu volaním metódy setPosition()
Úloha 2.5:
Implementujte metódu act() nasledovne:
- zníži hodnotu atribútu explodedTime o 1
- ak je hodnota atribútu rovná 0, odoberte zo sveta inštanciu samého seba
- ak je hodnota atribútu rovná 0, ukončite hru volaním System.exit(0)
Úloha 2.6:
Upravte metódu act() v triede Player tak, aby pri hodnote
energie menšej alebo rovnej 0 pridala svetu nového aktora, čiže inštanciu triedy
DyingPlayer. Pri volaní konštruktora DyingPlayer využite aktuálnu
pozíciu hráča.
Úloha 2.7:
Overte správnosť riešenia spustením hry. Ak hráčovi klesne energia na 0, spustí sa animácia
DyingPlayer a hra sa ukončí.

Krok č. 3
V treťom kroku umožníte hráčovi brániť sa pred alienmi. Hráč bude môcť zničiť alienov
výstrelom zo zbrane pri stlačení klávesy SPACE. Ak sa náboj bude prekrývať
s pozíciou aliena zníži sa mu úroveň energie.
Úloha 3.1:
Vytvorte nový enumeračný typ Direction v balíčku alien.
Enumeračný typ bude mať štyri hodnoty:
- UP
- DOWN
- RIGHT
- LEFT
Poznámka:
Pri definícii enumeračného typu použite kľúčové slovo enum.
Pozrite doplňujúce odkazy.
Úloha 3.2:
V triede Alien vytvorte atribút energy, nastavte ho na 100 a vytvorte k nemu prístupové metódy
getEnergy() a setEnergy().
Úloha 3.3:
Vytvorte novú triedu Bullet v balíčku alien.actor.item.
ktorá dedí od triedy AbstractActor.
Úloha 3.4:
Trieda Bullet bude mať nasledovné atribúty:
- direction: orientácia letu náboja typu Direction
- SPEED: - konštanta určujúca rýchlosť náboja, nastavte defaultne na 5, neskôr môžete skúsiť túto hodnotu zmeniť
Úloha 3.5:
Vytvorte konštruktor s tromi parametrami:
- x: x-ová pozícia náboja pri jeho vytvorení typu int
- y: y-ová pozícia náboja pri jeho vytvorení typu int
- direction: smer, ktorým má letieť náboj typu Direction
Úloha 3.6:
Konštruktor implementujte nasledovne:
- nastaví pozíciu náboja zvýšenú o 8 v oboch súradniciach
- nastaví smer na základe parametra predaného konštruktorom
- vytvorí nový objekt animácie použitím obrázku "resources/images/bullet.png" a hodnotami: 16, 16, 100
- animáciu pootočí o uhol, ktorý je daný smerom letu náboja: 0°, 90°, 180°, 270°
Úloha 3.7:
Implementujte metódu act(), aby zmenila pozíciu náboja o SPEED v požadovanom smere,
a ak sa nová pozícia pretína s pozíciou aliena, znížte alienovi úroveň energie.
Dosiahnete to nasledovnými krokmi:
- na základe smeru letu náboja direction a jeho rýchlosti SPEED zistite zmenu pozície náboja v x-ovom a y-ovom smere
- nastavte novú pozíciu volaním metódy setPosition()
- ak sa náboj na novej pozícii prekrýva so stenou odoberte ho zo sveta
- iterujte cez všetkých aktorov vo svete
- ak aktor je typu Alien a prekrýva sa s pozíciou náboja znížte mu energiu o 10 a odoberte náboj zo sveta
Poznámka:
Keďže rozhranie World implementuje rozhranie Iterable
slúži ako zoznam všetkých Actor-ov v hre. Iterovať cez všetkých aktorov v hre môžete
nasledovne:
for(Actor actor: getWorld()){ ... }
Úloha 3.8:
V triede Player upravte metódu act() nasledovne:
- na základe stlačenej klávesy zistite smer pohybu háča
- ak je stlačená klávesa SPACE vytvorte nový objekt triedy Bullet
- pri volaní koštruktora triedy Bullet využite parametre: pozícia hráča, smer pohybu hráča
- pridajte objekt náboja svetu
Úloha 3.9:
V triede Alien upravte metódu act(), aby odobrala objekt (seba samého) zo sveta
v prípade, že úroveň energie je rovná alebo nižšia ako 0.
Úloha 3.10:
Overte správnosť riešenia spustením hry. Hráč by mal vedieť zničiť aliena po zopár zásahoch.

Krok č. 4
Doplňujúce úlohy
Ďalšie zdroje
- Enumeračné typy
- Cyklus for v programovacom jazyku Java
- Syntax cyklu for na stránkeStackoverflow
- Rozhranie Iterable
$Id$