Fred - Backpack
Ciele
- Precvičiť použitie generických kolekcií.
- Využiť prázde rozhranie pre odlíšenie prenositeľných predmetov od neprenositeľných.
- Oboznámiť sa s využitím triedy org.newdawn.slick.Graphics na vytvorenie grafickej reprezentácie Fredovho batoha.
Úvod
Na dnešnom cvičení vytvoríte pre Freda batoh, do ktorého bude môcť pridávať prenositeľné predmety. Fred bude môcť tieto predmety použiť, vybrať z batoha a položiť znova do herného sveta.
V druhej časti bude vašou úlohou pridať grafické zobrazenie obsahu batoha a ovládanie na klávesnici pre jeho používanie.
Postup
-
Úloha: Vytvorte triedu BackpackImpl, ktorá bude reprezentovať Fredov batoh.Táto trieda nech implementuje už pripravené rozhranie Backpack.Úloha: V konštruktore tejto triedy vytvorte zoznam, do ktorého sa predmety budú pridávať.Použite na to generickú kolekciu ArrayList<Item>().Úloha: Zabezpečte, aby mal batoh obmedzenú kapacitu.Táto kapacita nech sa nastavuje pomocou konštruktora.Úloha: Implementujte telo metód getCapacity(), ktorou je možné získať maximálny počet predmetov vložených do batoha, a getCurrentSize(), ktorá zistí aktuálny počet predmetov v batohu.Úloha: Implementujte telo metódy add(), ktorá sa postará o pridanie predmetu do batoha.Nezabudnite pri tom na skutočnosť, že kapacita batoha je obmedzená a nie všetky predmety herného sveta je možné zbierať. Pri úspešnom pridaní predmetu metóda vráti hodnotu true, v opačnom prípade false. Pri neúspechu taktiež vypíšte na obrazovku informačnú správu o tom, čo bolo jeho príčinou.Úloha: Implementujte telo metódy removeItem(), ktorá na základe jedinečného mena nájde v batohu predmet a odstráni ho.Ak bolo odstránenie úspešné, metóda vráti referenciu na odstránený predmet, v opačnom prípade nech sa vypíše na obrazovku správa o príčine neúspechu a metóda vráti hodnotu null.Úloha: Implementujte telo metódy getItem(), ktorá na základe jedinečného mena získa referenciu na daný predmet nachádzajúci sa v batohu.Ak sa referenciu podarilo získať, metóda ju vráti. V opačnom prípade o neúspechu informuje patričnou správou a vracia hodnotu null.Poznámka: Aby bolo možné navzájom odlíšiť predmety, ktoré sú inštanciami rovnakej triedy, je potrebné, aby mal každý vytvorený predmet jedinečné meno.Úloha: Pokiaľ vami vytvorená abstraktná trieda Item nemá metódu pre získanie mena predmetu (getName()), pridajte ju tam. Zabezpečte, aby sa v konštruktore tried rozširujúcich triedu Item nastavovalo toto jedinečné meno.
-
V hre bude pre Freda k dispozícii len jeden batoh. Tento batoh bude reprezentovaný pomocou členskej premennej v triede Fred. V tomto kroku sa postaráte o to, aby bol batoh reálne vytvorený a pripravený na používanie.Úloha: V konštruktore triedy Fred sa postarajte aj o inicializáciu batoha. Maximálny počet predmetov, ktoré bude možné doň umiestniť, nastavte napríklad na hodnotu 5.Úloha: Vytvorte metódu getBackpack(), ktorá vráti referenciu na Fredov batoh.Úloha: Vytvorte zoznam, v ktorom budú všetky predmety, nachádzajúce sa v hernom svete (hviezdičky, elixíry života...).Zabezpečte, aby bol každý taký predmet pri svojom vzniku pridaný do tohto zoznamu (doplňujúca úloha z predchádzajúceho cvičenia).Poznámka: Tento zoznam sa bude používať neskôr pri manipulovaní s predmetmi.
-
Obsahom tretieho kroku bude prepojenie použitia konkrétnych klávesov s metódami pre zobratie predmetu do batoha, jeho vyloženie naspäť do herného sveta a použitie.Úloha: Ku klávesám pre ovládanie Freda pridajte aj klávesu, po ktorej stlačení Fred zodvihne prenositeľný predmet, s ktorým je práve v kontakte.Tento predmet nech zmizne z herného sveta a pridá sa do zoznamu predmetov triedy reprezentujúcej batoh. Zobratie predmetu v skratke zahrňuje tieto kroky:
- získať referenciu na predmet, s ktorým je Fred v interakcii
- overiť, či sa s nájdeným predmetom môže hýbať
- skontrolovať kapacitu batoha
- odobrať daný predmet zo zoznamu predmetov herného sveta
- pridať predmet do zoznamu predmetov Fredovho batoha
Úloha: Upravte triedu ElixirOfLife tak, aby sa elixír života nepoužil automaticky pri kontakte s Fredom. Nech ho Fred najprv vezme do batoha (po stlačení patričnej klávesy) a až potom ho môže použiť.Na tomto predmete si môžete otestovať svoj doterajší postup. Pre kontrolu vypíšte po jeho pridaní obsah a aktuálnu veľkosť batoha.Úloha: V triede implementujúcej rozhranie Backpack pridajte členskú premennú typu Item, v ktorej bude uložená referencia na jeden z predmetov batoha - tzv. aktuálny predmet.Úloha: Doimplementujte zostávajúce metóty rozhrania Backpack:- getCurrentItem() - získa predmet, ktorý je v rámci batoha zvolený ako aktuálny pre ďalšiu manipuláciu
- setCurrentItem() - nastaví, ktorý predmet bude v batohu zvolený ako aktuálny
Úloha: Ku ovládacím klávesám pridajte klávesu, na ktorej stlačenie Fred zareaguje vybratím aktuálneho predmetu z batoha a položením do herného sveta na svoju momentálnu pozíciu.Úloha: Pridajte ovládaciu klávesu pre použitie aktuálneho predmetu batoha.Predmet by sa mal po použití z batoha odstrániť.Úloha: Pridajte ovládaciu klávesu, ktorou budete môcť "listovať" v zozname predmetov batoha.Po jej stlačení sa nastaví ako aktuálny predmet ten, čo v zozname nasleduje za predmetom, ktorý bol aktuálny pred stlačením klávesy. Zabezpečte, aby sa dalo obsahom batoha prechádzať cyklicky, t.j. ak dosiahnete koniec zoznamu, pri najbližšom posune sa prejde znova na jeho začiatok.Úloha: Overte správnosť svojej implementácie. -
Náplňou posledného kroku je vytvorenie grafickej reprezentácie Fredovho batoha (resp. jeho obsahu). Pre lepšiu predstavu (alebo inšpiráciu ;)) si pozrite tento obrázok. Obsah Fredovho batoha (v tomto prípade aktuálny predmet) sa zobrazuje v jednoduchom, na tento účel vyčlenenom štvorci na spodnom okraji obrazovky. Štvorec je kreslený pomocou metód triedy org.newdawn.slick.Graphics.Na začiatok je vhodné pripraviť na obrazovke podkladový útvar (napríklad štvorec), na ktorom budú vykreslené ikony pre predmety v batohu. Týmto podkladom lepšie vizuálne odlíšite vykresľované ikony predmetov od tých z herného sveta.Úloha: Vytvorte objekt pre reprezentáciu požadovaného tvaru.Ak napríklad chcete vytvoriť štvorec, použite na to triedu Rectangle.Úloha: Nastavte farbu, ktorá bude použitá na vyplnenie vytvoreného tvaru a tento útvar vykreslite na obrazovku.Farbu nastavíte pomocou metódy setColor triedy Graphics. Vykreslenie môžete zrealizovať metódou draw, v ktorej ako parameter zadáte vami vytvorený tvar.Úloha: Získajte referenciu na aktuálny predmet batoha. Z tohto predmetu získajte jeden z obrázkov tvoriacich jeho animáciu a tento obrázok vykreslite patrične zmenšený na vopred pripravený podkladový útvar.Ak sa v batohu nenachádza žiaden predmet, ponechajte len prázdny podklad.Úloha: Otestujte vašu implementáciu.
-
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 bol podkladový štvorec na vykreslenie batoha čiastočne priesvitný, ak je batoh prázdny. Akonáhle sa doň pridá nejaký predmet, nech sa podkladový štvorec zmení na úplne nepriesvitný.
- Skúste namiesto ikony predmetu batoha vykresliť jeho zmenšenú animáciu.
- Porozmýšľajte nad tým, ako by sa dalo vykresľovanie Fredovho batoha optimalizovať.
Ďalšie zdroje
- Generics in the Java Programming Language
- Domovská stránka softvérového rámca Slick2D
- Slick2D Tutorials
- JavaDoc knižnice Slick2D
$Id$