Fred - Level
Ciele
  1. Precvičiť využívanie kolekcií.
  2. Implementovať rozhrania pomocou predpísaných rozhraní vo vlastných triedach.
  3. 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
  1. 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());
                
  2. 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.
  3. 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().
  4. Vymažte projekt z disku a zrušte všetky vami vytvorené nastavenia v prostredí BlueJ a NetBeans!
Doplňujúce úlohy
  1. 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.
$Id: 04.xml 69 2011-12-04 08:22:14Z saren $
$Id$