Tiles
Ciele
  1. Vytvorenie a práca s poľom dlaždíc.
  2. Vykresľovanie.
Úvod
V tomto kroku vykrelíte hracie pole tak ako je potrebné. Budete využívať prácu s bitmapou, zaujímavá može byť pre vás v budúcnosti aj vektorová grafika, to už nechávame na vašom zapálení pre vývoj aplikácií na Android platforme.
Postup
  1. V tomto kroku si pripravíte objekt predstavujúci dlaždicu v hracom poli.
    Úloha:  Otvorte si projekt HelloAndroid z minulého cvičenia alebo si ho stiahnite a importujte do vývojového prostredia Eclipse.
    Úloha:  Pridajte do zdrojového súboru /res/values/colors.xml predvolenú farbu dlaždíc puzzle_default, farbu mriežky medzi dlaždicami puzzle_outline a farbu pre vybranú dlaždicu puzzle_selected.
    Úloha:  Vytvorte verejnú triedu reprezentujúcu dlaždicu /src/tuke.fei.hello/Tile.java, ktorá bude implementovať rozhranie Parcelable slúžiace na serializáciu a deserializáciu dát.
    Poznámka:  Každá trieda implementujúca toto rozhranie musí obsahovať verejnú statickú premennú CREATOR implementujúcu rozranie Parcelable.Creator, ktoré generuje objekty danej triedy z triedy Parcel.
    Úloha:  Implementujte rozhranie Parcelable pomocou objektu CREATOR , parametrického typu Parcelable.Creator, ktorého parametrom bude trieda Tile, použitím jednoduchého konštruktora.
    Uvažujeme, že hracie pole pozostáva z dlaždíc, pričom každá ma pridelenú farbu a poradové číslo podľa prvotného umiestnenia v hracom poli. Tieto dlaždice budú uchované v jednorozmernom poli.
    Úloha:  Vytvorte verejný konštruktor Tile(int, int), parametrami sú farba a číslo dlaždice.
    Úloha:  Vytvorte privátny konštruktor Tile(Parcelable), ktorý sa bude využívať pri rekonštrukcii objektu, zatiaľ ho ponechajte prázdny.
    Úloha:  Použite refaktorizáciu pre zapúzdrenie premenných pre farbu a číslo dlaždice.
    Aby mohli byť objekty rekonštruované z Parcel, musí byť každý najprv zapísaný pomocou metódy writeToParcel(Parcel, int).
    Úloha:  Implementujte metódu writeToParcel(Parcel, int) tak, aby zapísala do daného Parcel objektu farbu a číslo dlaždice. Využite pri tom metódu writeInt(int).
    Poznámka:  V akom poradí je objekt zapisovaný, v rovnakom poradí bude aj načítavaný.
    Úloha:  Doplňte privátny konštruktor o načítanie čísla a farby dlaždice z daného Parcel objektu a ich uloženie.
    Úloha:  Implementujte metódu createFromParcel(Parcel) tak, aby vytvorila - zrekonštruovala dlaždicu z daného Parcel objektu.
    Úloha:  Implementujte metódu newArray(int) tak, aby vrátila jednorozmerné pole dlaždíc o danej veľkosti.
  2. Cieľom tohto kroku je vytvoriť a vykresliť hracie pole pozostávajúce z dlaždíc, ktorých počet je určený hráčovým výberom stupňa obtiažnosti.
    Úloha:  Deklarujte v triede /src/tuke.fei.hello/GameView.java premennú myTiles, ktorá bude jednorozmerným poľom typu Tile uchovávajúca dlaždice v hracom poli.
    Úloha:  Deklarujte v triede /src/tuke.fei.hello/GameView.java premennú myBlankTile typu int, ktorá bude definovať na akej pozícii v hracom poli sa nachádza prázdna dlaždica.
    Úloha:  Upravte metódu newGame() tak, aby inicializovala a naplnila pole dlaždíc myTiles o veľkosti podľa hráčom zvoleného stupňa obtiažnosti. Každá dlaždica bude mať priradené poradové číslo a predvolenú farbu definovanú na začiatku cvičenia puzzle_default.
    Poznámka:  Týmto dosiahneme prvotné usporiadané pole dlaždíc, v závislosti od ďalšieho usporiadania poľa sa budú posudzovať pozície dlaždíc a stav hry.
    Úloha:  Index posledného prvku poľa priraďte premennej predstavujúcej prázdnu dlaždicu, nech je objekt na tomto indexe prázdny (null).
    Úloha:  Vytvorte metódy getTileWidth() a getTileHeight() s návratového typu float, ktoré vypočítajú šírku a výšku dlaždice v závislosti od aktuálnych rozmerov obrazovky a stupňa obtiažnosti.
    Vykresľovanie na ploche plátná klasicky začína na súradniciach (x,y)=(0,0) v ľavom hornom rohu. Pre každú dlaždicu je potrebné určiť súradnice v závislosti od jej usporiadania na hracom poli, teda v ktorom riadku a v ktorom stĺpci sa nachádza. Ďalej bude pre danú dlaždicu vykreslené ohraničenie, ktoré v konečnom dôsledku bude tvoriť mriežku na hracom poli a nakoniec sa vykreslí číslo jej pridelené.
    Úloha:  Upravte metódu onDraw() tak, že už nebude vykresľovať počet dlaždíc ale jednotlivé dlaždice s tým, aby ste pre každú dlaždicu mali k dispozícii súradnice ľavého horného rohu a pravého dolného rohu.
    Poznámka:  Na určenie súradníc nie sú potrebné krkolomné výpočty, stačí si uvedomiť súvis medzi pozíciou dlaždice v poli a počtom dlaždíc na riadok/stĺpec.
    Úloha:  Nastavte farbu vykresľovania na farbu dlaždice (obdobne ako v minulom cvičení) a vykreslite dlaždicu na objekte plátna zavolaním metódy drawRect(float, float, float, float, Paint). Pre prázdnu dlaždicu sa nevykonáva vykreslenie.
    Úloha:  Aby ste mohli vykresliť ohraničenie, vytvorte si pomocnú metódu getOutlines(float, float, float, float), ktorej návratovou hodnotou bude pole objektov typu float, jej parametrami sú súradnice ľavého horného a pravého dolného rohu dlaždice.
    Úloha:  Implementujte danú metódu tak, aby platilo, že cieľom tejto metódy je vrátiť pole čísiel predstavujúcich súradnice čiar ohraničujúcich dlaždicu v zmysle
    {ľavé horné x čiary č.1, ľavé horné y čiary č.1, pravé dolné x čiary č.1, pravé dolné y čiary č.1, ...}.
    Úloha:  Nastavte farbu vykresľovania na farbu mriežky a vykreslite ohraničenie na objekte plátna zavolaním metódy drawLines(float[], Paint).
    Úloha:  Vykreslite číslo pridelené danej dlaždici ekvivalentne postupu z minulého cvičenia.
  3. Práca s bitmapou.
    Úloha:  Pridajte do zdrojového adresára /res/drawable obrázok predstavujúci hracie puzzle.
    Úloha:  Deklarujte v triede GameView.java premennú myBitmap typu Bitmap.
    Úloha:  Načítajte do premennej myBitmap zvolený obrázok v metóde newGame() tak, že na triede BitmapFactory zavoláte statickú metódu decodeResource(Resources, int), ktorej int parametrom bude id zdrojového puzzle obrázka.
            myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.puzzle);
           
    Úloha:  Upravte metódu onDraw() tak, že už nebude vykresľovať obdĺžnik predstavujúci dlaždicu.
    Úloha:  Pred cyklom vykresľovania komponentov pre každú dlaždicu, zavolajte na objekte plátna metódu pre vykreslenie bitmapy drawBitmap(Bitmap, float, float, Paint).
    Poznámka:  Ako ste si mohli všimnúť, v tejto úlohe ste iba na vykreslenú bitmapu vykreslili mriežku a čísla prislúchajúce jednotlivých dlaždiciam.
    Úloha:  Odstráňte v metóde onDraw() načítanie obrázka a upravte cyklus vykresľovania dlaždíc tak, že pre každú vytvoríte objekty typu Rect pomocou jednoduchého konštruktora Rect(int, int, int, int):
    • zdrojový objekt - prislúchajúcu oblasť na bitmape,ktorá bude vykresľovaná na plátno, je treba brať ohľad na číslo priradené dlaždici
    • cieľový objekt - vykresľovaná oblasť na plátne, je treba brať ohľad na pozíciu dlaždice v rámci poľa
    Úloha:  Zavoláte metódu drawBitmap(Bitmap, Rect, Rect, Paint), ktorej parametrami bude už použitý zdrojový obrázok a vytvorené Rect objekty.
    Úloha:  Na konci metódy newGame() poprehadzujte v jednoduchom cykle poradie prvkov v poli dlaždíc myTiles. Pri tvorbe tejto metódy ešte neuvažujete prípustné kroky pre premiešanie.
Doplňujúce úlohy