Alien Breed VI. - Dangerous aliens

Ciele

  1. Naučiť sa pracovať s enumeračným typom.
  2. Naučiť sa používať cyklus foreach v programovacom jazyku Java.
  3. 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.
Obr.:Znižovanie energie hráčovi pri stretntí s alienom.

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čí.
Obr.:Hráč bol zničený alienom.

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.
Obr.:Hráč strieľa po alienovi.

Krok č. 4

Doplňujúce úlohy

    $Id$