Fred - Level
Ciele
- Precvičiť využívanie kolekcií.
- Implementovať rozhrania pomocou predpísaných rozhraní vo vlastných triedach.
- Vytvoriť a pripraviť herný svet pre jeho grafickú reprezentáciu.
Úvod
Náplňou tohto cvičenia bude vytvoriť v hre ďalšie postavy, s ktorými Fred príde do kontaktu a
level, ktorého budú všetky postavy a predmety súčasťou.
Okrem toho doplníte niekoľko vecí potrebných k neskoršiemu vytvoreniu grafickej hernej mapy.
Postup
-
V prvom kroku spravíte niekoľko úprav v triede Fred a taktiež naučíte Freda skákať.Úloha: V hernej knižnici kostry projektu pribudli triedy Character, Enemy a Player a rozhranie Level. Aktualizujte váš projekt, než sa pustíte do ďalších úloh.Úloha: Upravte triedu Fred tak, aby dedila od abstraktnej triedy Player. V konštruktore inicializujte počet Fredových životov a počiatočné skóre.Úloha: Implementujte metódu jump() a určte klávesu, po ktorej stlačení Fred vyskočí.Najprv je potrebné určiť, ktorá y-ová súradnica bude zodpovedať tomu, že Fred stojí na zemi. Pri výskoku Fred vystúpi do určitej výšky (tiež potrebné stanoviť) a keďže naňho stále pôsobí gravitácia, spadne na zem. Ďalej zabezpečte, aby Fred neprechádzal pri výskoku mimo okna, čiže hornou hranicou jeho pohybu v smere osi y bude horný okraj okna.Poznámka: Nezabudnite na to, že súradnica [0,0] sa nachádza v ľavom hornom rohu okna.Pre uplatnenie gravitácie a pohybu pri výskoku sa môžete inšpirovať nasledujúcim kódom:
public void applyGravity(){ if(this.y == ground){ fallingSpeed = 0; //fallingSpeed je clenska premenna na zaciatku inicializovana na hodnotu 0 } else{ if(fallingSpeed < 0){ moveY(-Math.min(-fallingSpeed, getSpaceUp())); //getSpaceUp() zisti, kolko volneho priestoru ma Fred nad hlavou } else{ moveY(Math.min(fallingSpeed, getSpaceDown())); } fallingSpeed += 2; } } public void moveY(int delta){ int imageHeight; //tu je potrebne ziskat vysku obrazka z animacie boolean stop = false; float newY; if(delta < 0){ //ide nahor - ked skace newY = y + (delta * 0.3f); if(newY <= 0) stop = true; if((newY > 0 ) && (!stop)){ y = newY; } } else{ //pada k zemi newY = y + (delta * 0.3f); if(newY + imageHeight >= ground) stop = true; if(((newY + imageHeight) < ground && (!stop)){ y = newY; } } }pričom v metóde pre výskok, ak Fred stojí na zemi, premenná fallingSpeed sa nastaví na mínusovú hodnotu výšky výskoku a parameter pre volanie metódy moveY() vyzerá nasledovne:int param = -Math.min(jumpHeight, getSpaceUp()); -
Náplňou tohto kroku je vytvorenie prvého Fredovho nepriateľa.Úloha: Vytvorte triedu Skeleton, ktorá dedí od abstraktnej triedy Enemy a reprezentuje v hre nepriateľa - kostlivca.V konštruktore nastavte silu jeho útoku. Tak ako hráč, aj nepriateľ má na začiatku isté množstvo životnej energie. Nezabudnite na priradenie jedinečného mena, vytvorenie animácie a umiestnenie do hry.Úloha: V triede implementujte metódu, ktorá zabezpečuje útočenie nepriateľa na hráča, ak je s ním v kolízii.Skeleton nech pri tom využíva silu útoku, ktorú ste mu nastavili.
-
V tomto kroku vytvoríte level vašej hry.Úloha: Vytvorte triedu LevelImpl, ktorá bude implementovať rozhranie Level.V triede vytvorte členskú premennú typu int, ktorá bude uchovávať čiselný identifikátor levelu. Konštruktor tejto triedy bude mať jeden parameter typu int a nastaví identifikátor levelu na hodnotu zadanú v parametri.Úloha: Zoznam všetkých predmetov a postáv v leveli je potrebné nejakým spôsobom uchovať. Vytvorte si preto v triede členskú premennú, ktorá bude obsahovať generickú kolekciu ArrayList<Actor>().Úloha: Vytvorte členskú premennú typu Player, ktorá bude uchovávať referenciu na hráča pohybujúceho sa v danom leveli.Úloha: Vytvorte členskú premennú typu TiledMap, ktorá neskôr bude obsahovať hernú mapu, vytvorenú v programe Tiled, pre daný level.Úloha: Teraz implementujte metódy rozhrania Level.Metóda update() spôsobí update všetkých Actor-ov v leveli. Podobne je to aj pri metóde render().Poznámka: Všimnite si, že abstraktné triedy Item a Character implementujú rozhranie Actor. Item je rodičovskou triedou pre všetky predmety vyskytujúce sa v hre. Od abstraktnej triedy Character zas dedí abstraktná trieda Player, ktorá predstavuje rodičovskú triedu pre Freda a trieda Enemy, ktorá je rodičovskou triedou pre všetkých nepriateľov. Prostredníctvom tejto hierarchie tried máte možnosť pracovať so všetkými predmetmi a postavami hry ako s Actormi. Taktiež, ak by ste chceli získať zoznam napríklad všetkých nepriateľov v leveli, môžete to spraviť jednoducho pomocou overenia Actor-ov, či sú inštanciou patričnej triedy.Úloha: V metóde init() triedy Game vytvorte inštanciu triedy LevelImpl. Do vytvoreného levelu pridajte hráča a ostatné postavy a predmety.Úloha: V metóde update() triedy Game zavolajte rovnomennú metódu nad levelom. Takto zabezpečíte update všetkých postáv a predmetov v hre, namiesto toho, aby ste to museli robiť pre každý predmet a postavu osobitne.Úloha: Podobne ako v predchádzajúcom kroku upravte v triede Game aj metódu render().
-
Vymažte projekt z disku a zrušte všetky vami vytvorené nastavenia v
prostredí BlueJ a NetBeans!
Doplňujúce úlohy
- Pokúste sa zabezpečiť, aby počas interakcie Freda s nepriateľom mohol nepriateľ na Freda zaútočiť len raz za nejaký časový úsek - napríklad 3 sekundy. To znamená, že ak sa Fred nepriateľa nemôže striasť napríklad 9 sekúnd, ten mu odoberie energiu 3 krát, nie toľko krát, koľko prebehne test na interakciu.
Ďalšie zdroje
- Domovská stránka softvérového rámca Slick2D
- Slick2D Tutorials
- JavaDoc knižnice Slick2D
$Id$
