Hra Obesenec/Hangman
Cieľ
Cieľom stretnutia je vytvoriť hru Obesenec (Hangman). Využijeme pritom
- obrázky realizované ako resources
- naučíme sa základy životného cyklu aktivity a zistíme, prečo v Androide neexistuje zatváracie tlačidlo
- ukážeme si, ako možno využívať bežný Java kód
- naučíme sa notifikovať používateľa pomocou toastov.
Materiály
- popis biznis logiky triedy
- kompletné zdrojové kódy na Githube.
Kostra projektu
- stiahnite si kostru projektu
- obsahuje štandardnú Java triedu s kódom logiky hry
- ak trieda využíva len veci z JDK 5 a novšej, dá sa bez problémov vložiť do projektu
- toto je príklad, keď sa zdroják prekompiluje do
.class
a následne do.dex
- plus ukážkové PNG obrázky pre šibenicu
GUI
- venujme sa minimalistickej verzii:
- label
TextView
pre uhádnuté písmená- neuhádnuté indikované podtržníkmi
- textové políčko
EditText
pre zadávanie textu- maximálna dĺžka 1 (nastaviteľné v layoute)
- obrázok
ImageView
pre obrázok šibenice
- label
po kliknutí na šibenicu sa vyhodnotí kolo
realizujeme klasickým atribútom
onClick
:<ImageView android:id="@+id/gallowsImageView" android:src="@drawable/gallows0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="gallowsImageViewClick" />
čakáme, že v aktivite bude metóda:
public void gallowsImageViewClick(View view)
Resources
- obrázok so šibenicou potrebuje odkaz na obrázok
- vložíme ho do
res/drawable
- adresár obsahuje viacero podadresárov, určené pre rozličné typy zariadení s rozličným rozlíšením či DPI
- súbory v
res/drawable
sú štandardné
- v obrázku využijeme
android:src="@drawable/gallows0"
ako odkaz nares/drawable/gallows0.png
.
Toast
slúžia na stručné informačné oznámenia, ktoré používateľ zoberie na vedomie a nemusí ich odklikávať (flash notifications)
Toast.makeText(this, "You must enter a letter.", Toast.LENGTH_SHORT) .show();
- potrebujeme:
- kontext: obvykle aktivita, z ktorej vyvolávame aktivitu
- text, ktorý sa zobrazí
- dĺžku zobrazenia: prevezmeme z konštanty
Farebné filtre
- Nastavme farebný filter pre obrázok.
Zafarbime ho do zelena, ak je hra vyhratá:
ColorFilter filter = new LightingColorFilter(Color.RED, Color.BLACK); gallowsImageView.setColorFilter(filter);
Životný cyklus
- aplikácia zatiaľ nereaguje na zmeny životného cyklu
- ak otočíme displej, aktivita sa ukončí a spustí nanovo
- očividný prejav: vygeneruje sa úplne nové slovo s odlišným počtom znakov
- musíme prekrývať metódy životného cyklu a ukladať stav
Stav aktivity
- čo je stavom aktivity?
- obsah textového políčka s písmenom
- aktuálny obrázok šibenice
- obsah políčka s uhádnutými písmenami
- stav aktivity je spätý so stavom hry
Game
- ak aktivita odchádza na pozadie, musíme stav inštancie aktivity uložiť
- využime
onSaveInstanceState()
s parametrom typuBundle
Bundle
je mapa, do ktorej môžeme uložiť objekty, ktoré majú prežiť reštart aktivityBundle
= zaváraninové poháre- nezabudneme zavolať rodičovskú implementáciu cez
super....
.
- využime
- ak je aktivita zabitá a znovuvytvorená, v
Bundle
príde mapa s predchádzajúcimi uloženými hodnotami- musíme však overiť aj situáciu, keď je
Bundle
rovnýnull
- musíme však overiť aj situáciu, keď je
- bonusová vlastnosť: stav komponentov s
android:id
sa manažuje automaticky - toto všetko sa týka prechodného stavu: ak niekto reštartne telefón a podobne, musíme riešiť ukladanie perzistentného stavu
- využijeme SQL databázu
- alebo súbory
- o tom nabudúce
- späť k hre
Game
: ak hru vyhlásime zaSerializable
, vieme ju ľahko pchať doBundle
- toto je Java záležitosť
- všetky inštančné premenné musia byť rekurzívne serializovateľné