Alien Breed III. - Items

Ciele

  1. Zopakovať si implementáciu abstraktných tried.
  2. Naučiť sa identifikovať kód, ktorý je spoločný pre skupinu tried (implementovaný v predkoch) a špecifický (implementovaný v potomkoch).
  3. Naučiť sa pretypovať objekt.

Úvod

Úlohou dnešného cvičenia je vytvoriť predmety, ktoré bude hráč môcť zobrať, ak príde na pozíciu daného predmetu.

Postup

Krok č. 1

Predmet, rovnako ako hráč, je určený pozíciou (x, y), má vlastnú animáciu a bude reagovať s okolím prostredníctvom metódy act(). Pozícia, animácia atď. sú aj vlastnosti triedy Player, ktorú ste implementovali na predošlom cvičení. Aby ste nemuseli spoločné vlastnosti a metódy pre hráča a predmet implementovať dvakrát, implementujete najprv spoločnú abstraktnú triedu AbstractActor.

Úloha 1.1:

Vytvorte novú abstraktnú triedu AbstractActor v balíčku alien.actor. Trieda bude dediť od rozhrania Actor.

Úloha 1.2:

Implementujte všetky metódy rozhrania Actor.
Poznámka:  Aby ste si zjednodušili prácu, stačí ak skopírujete potrebné atribúty a metódy z triedy Player. Rozlišujte čo je špecifické pre triedu Player a čo je spoločné pre všetkých Actor-ov !

Úloha 1.3:

Atribúty v absktraktnej triede AbstractActor deklarujte ako protected.

Úloha 1.4:

Metódu act() deklarujte ako abstraktnú.

Úloha 1.5:

Implementujte metódu addedToWorld(), ktorá nastaví atribút world na hodnotu predanú parametrom.

Úloha 1.6:

Triedu Player upravte tak, aby dedila od triedy AbstractActor, vďaka čomu implementuje rozhranie Actor, ako je to teraz.

Úloha 1.7:

Odstráňte v triede Player všetky metódy a atribúty, ktoré sú už implementované v triede AbstractActor a ponechajte iba špecifické časti.

Krok č. 2

Ako prvý predmet vytvoríte lekárničku, ktorá sa hráčovi určite zíde, keď bude musieť bojovať s nepriateľom.

Úloha 2.1:

Vytvorte novú triedu Energy v balíčku alien.actor.item, ktorá bude dediť od abstraktnej triedy AbstractActor.
Metódu act() zatiaľ ponechajte prázdnu. Odstráňte z nej vyhodenie výnimky UnsupportedOperationException, pretože ak ju ponecháte hra vám spadne počas behu.

Úloha 2.2:

Vytvorte konštruktor triedy Energy, v ktorom objekt hráča inicializujete.
Inicializácia pozostáva z nastavenia aktuálnej animácie, ktorá reprezentuje predmet Energy. Vytvorte preto novú animáciu s príslušnými parametrami:
  • relatívna cesta k obrázku animácie resources/images/energy.png
  • výška obrázku - 16
  • šírka obrázku - 16
  • čas v milisekundách - 10

Úloha 2.3:

V metóde main() vytvorte niekoľko predmetov Energy.
Nastavte im rôzne pozície prostredníctvom metódy setPosition() a pridajte ich svetu volaním metódy addActor() nad objektom sveta.

Úloha 2.4:

Overte správnosť svojej implementácie.
Ak ste postupovali správne, na hracom plátne by malo byť rozmietnených zopár lekárničiek.
Obr.:Hráč a lekárničky rozmiestnené po hracej ploche

Krok č. 3

Keďže zatiaľ ste neimplementovali batoh ani stavový riadok, predmet iba zmizne z plátna, ak ho hráč zoberie. Pre tento účel musíte implementovať metódu intersect(), ktorá zistí či hráč a predmet sa prekrývajú. Aby pre hráča a pre každý predmet bolo možné zistiť či sa prekrýva s iným predmetom, metódu intersect() implementujete priamo v trieda AbstractActor. Implementácia je možná dvoma spôsobmi:
  • priamou implementáciou algoritmu, ktorý zistí prekrytie dvoch obdĺžnikov
  • využitím triedy Rectangle2D, ktorá je súčasťou Java Development Kit a poskytuje metódu intersect()
Odporúčame pohrať sa s prvým riešením ;)

Úloha 3.1:

V metóde intersect() v triede AbstractActor implementujte algoritmus, ktorý zistí, či dva obdĺžniky ohraničujúce sprity sa prekrývajú.
Na implementáciu využite pseudoalgoritmus:
						x < a + w &&
						y < b + h &&
						a < x + width &&
						b < y + height
					
kde x, y sú súradnice pravého horného rohu jedného obdĺžnika a a, b druého obdĺžnika. Pozíciu, šírku a výšku actora viete získať prostredníctvo metód getX(), getY(), getWidth() a getHeight().
Obr.:Prekrytie obdĺžnikov ohraničujúcich sprite

Úloha 3.2:

Ak sa vám nepáči prvý spôsob, implementujte algoritmus zisťujúci prekrytie obdĺžnikov pomocou triedy Rectangle2D.Float a jej metódy intersect().
Vytvorte novú inštanciu triedy Rectangle2D.Float, ktorá reprezentuje obdĺžnik okolo hráča alebo predmetu. Konštruktor požaduje štyri parametre:
  • x-ová pozícia (ľavý horný roh): daná pozíciou hráča
  • y-ová pozícia (ľavý horný roh): daná pozíciou hráča
  • šírka obdĺžnika: daná šírkou animácie
  • výška obdĺžnika: daná výškou animácie
Poznámka:  Z triedy Rectangle2D nie je možné vytvoriť inštanciu priamo. Viete vytvoriť inštanciu iba vnorených tried Rectangle2D.Float alebo Rectangle2D.Double.Vnoreneé triedy určujú aký typ je použitý na reprezentáciu obdĺžnika. Inštanciu vytvoríte štandardne volaním
new Rectangle2D.Float(...)
Vytvorte rovnaký objekt obdĺžnika pre objekt actor, ktorý je parametrom metódy intersect() v triede AbstractActor. Zistite či sa tieto dva obdĺžniky prekrývajú. Realizujete to volaním metódy intersects() na jednom z obdĺžnikov. Druhý obdĺžnik použijete ako parameter tejto metódy.

Úloha 3.3:

Hodnotu, ktorú ste získali, použite ako návratovú hodnotu aktuálne vytváranej metódy.

Krok č. 4

Aby hráč mohol zbierať lekárničky, potrebujete implementovať metódu act() v triede Energy. Ak pozícia hráča sa prekrýva s pozíciou lekárničky, odoberiete lekárničku z herného sveta a zvýšite úroveň energia hráčovi. Pridáte taktiež výpis aktuálnej úrovne energie hráča.

Úloha 4.1:

V triede Player pridajte atribút energy a vytvorte k nemu prístupové metódy getEnergy() a setEnergy().

Úloha 4.2:

V triede Player vytvorte konštantu (fianálny statický atribút) ENERGY a nastavte ho na 100. Atribút energy nastavte na túto konštantu.

Úloha 4.3:

Implementujte metódu act() v triede Energy nasledovne:
  • zistite, či sa pozícia lekárničky prekrýva s pozíciou hráča volaním metódy intersect()
  • ak sa pozície prekrývajú odoberte hráča zo sveta volaním metódy removeActor() nad objektov sveta
  • ak sa pozície prekrývajú taktiež zvýšte energiu hráča volaním metódy setEnergy() na objekte hráča o 10
Poznámka:  Objekt hráča musíte pretypovať na Player, pretože getPlayer() vracia objekt typu Actor, ktorý neobsahuje metódu setEnergy().

Úloha 4.4:

Zabezpečte výpis energie hráča v metóde act() triedy Player:
  • vytvorením nového objektu triedy Message, ktorej konštruktor požaduje tri parametre: správu, x-ovú pozíciu a y-ovú pozíciu
  • pozíciu správy nastavte na ľavý dolný roh okna čiže: 10, 380
  • vypíšte správu volaním metódy showMessage() na objekte world

Úloha 4.5:

Overte správnosť svojej implementácie.
Ak ste postupovali správne, váš hráč by mal vedieť zbierať lekárničky, čím sa mu bude zvyšovať energia.
Obr.:Zobrazenie energy hráča

Krok č. 5

Doplňujúce úlohy

  1. Vytvorte v triede Main metódu pre náhodné rozmiestnenie lekárničiek. Parametrom metódy je počet lekárničiek, ktoré majú byť vytvorené. Zabezpečte aby vytvorené lekárničky neboli mimo okna hry.
$Id$