TiK ToK
Ciele
- Aplikovať do hry časovač.
- Pridať do hry podporu zvukových efektov.
- Naučiť sa vytvárať jednoduché animácie.
Úvod
Aby používateľ mohol sledovať svoje výkony v hre, je potrebné implementovať
časovač. Ďalšími pridanými prvkami do hry môže byť pridanie zvukových efektov
pri pohybe dlaždice alebo pri dosiahnutí stavu, kedy hráč úspešne vyriešil
hru. Zaujímavým dodatkom môže byť vytvorenie animácie - napr. vibrovania, keď
je hra vyriešená a hráč sa pokúsi pohnúť dlaždicami.
Postup
-
V tomto kroku aplikujete do hry už vytvorený časovač zo série widgetov vyvinutých pre Android aplikácie. V hre sa časovač bude zobrazovať nad hraným puzzle v niektorom z rohov obrazovky.Úloha: Otvorte si projekt HelloAndroid z minulého cvičenia alebo si ho stiahnite a importujte do vývojového prostredia Eclipse.Doteraz ste v návrhových súboroch využívali návrhový prvok LinearLayout , ktorý usporiadal svoje elementy vertikálne, prípadne horizontálne. V tomto prípade však potrebujeme zmeniť návrhový súbor hracieho poľa tak, aby objekt časovača prekrýval View objekt hracieho poľa. K tomuto účelu je potrebné využiť na zaobalenie objektov FrameLayout , ktorého zobrazovanie prvkov pracuje na princípe zásobníka.Úloha: Doplňte do návrhového súboru pre hracie pole /res/layout/game.xml element Chronometer s nasledujúcimi atribútmi
android:id="@+id/chrono" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top|right" android:textStyle="bold" android:textColor="#8D38C9" android:saveEnabled="true" android:padding="2dip" android:gravity="center"
Voliteľnými atribútmi môžu byť atribúty definujúce tieň pod časovačom.android:shadowColor="#000000" android:shadowDx="1" android:shadowDy="1" android:shadowRadius="1"
Poznámka: Hodnoty atribútov v návrhových súboroch samozrejme môžete meniť podľa vlastného uváženia (na vlastné riziko :-P ).Úloha: Uistite sa, že objekt časovača sa nachádza v poradí za View objektom hracieho poľa, keďže je nevyhnutné, aby sa časovač zobrazoval nad týmto objektom a zaobaľte tieto dva objekty do návrhového prvku FrameLayout s atribútmiandroid:layout_width="wrap_content" android:layout_height="wrap_content"
Úloha: Upravte Aktivitu src/tuke.fei.hello/Game.java, deklarujte premennú prostredia myChronometer typu Chronometer ktorá bude inicializovaná pri vytváraní Aktivity na príslušný objekt definovaný v návrhovom súbore.Ak nenastavíte časovaču čas, od ktorého má začať počítanie, bude počítať od času, kedy bol vyvolaný začiatok počítania, teda zavolaná metóda start(). Prednastavený formát zobrazovania je nastavený na MM:SS alebo H:MM:SS, tento formát je možné zmeniť pomocou setFormat(String).Úloha: Využite na inicializáciu času počítadla volanie statickej metódy elapsedRealtime() na triede SystemClock, v parametri metódy setBase(long) na objekte časovača a spustie počítanie.Poznámka: elapsedRealtime() vracia čas od nabootovania Aktivity, v tomto prípade sa teda začne počítanie od 0 akonáhle začína hra, čo bolo cieľom. -
Cieľom tohto kroku je vytvorenie a použitie zvukových efektov v Android aplikácii.Úloha: Vytvorte zdrojový adresár, ktorý slúži na uloženie multimediálnych súborov /res/raw a uložte do neho zvukový súbor pre pohyb dlažidce, napr. ding.wav.Úloha: Upravte Aktivitu src/tuke.fei.hello/Game.java, deklarujte premenné
// SoundPool - trieda na vytvorenie a prehrávanie zvukov private SoundPool mySoundPool; // identifikátor zvoleného zvuku private int myClickSound; // AudioManager - handler pre servis prehrávajúci zvuk private AudioManager myAudioManager;
Úloha: Inicializujte premenné pri vytváraní Aktivity// prvy argument udava maximalny pocet nezavislych streamov mySoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100); myClickSound = mySoundPool.load(this, R.raw.ding, 1); // audio manažér pre obsluhu servisu pre prehravanie zvuku myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
Úloha: Vytvorte verejnú metódu playSound() bez návratovej hodnoty, ktorá bude volaná pri premiestnení dlaždice.Hlasitosť prehrávaného zvuku by mala byť totožná s nastavenou hlasitosťou telefónu. Toto nastavenie je uložené v AudioManager.STREAM_MUSIC.Úloha: Vo vytvorenej metóde načítajte hlasitosť telefónu pomocou volania metódy getStreamVolume(int) na objekte audio manažéraÚloha: Spustite prehratie zvukumySoundPool.play(myClickSound, streamVolume, streamVolume, 1, 0, 1f);
Poznámka: Druhý a tretí argument označujú jednotlivo pravú a ľavú hlasitosť, ďalším je priorita prehrávania, nasleduje príznak opakovaného prehrávania (0 - bez opakovania, -1 - nekonečná slučka), posledným parametrom je frekvencia prehrávania (1.0 - pôvodná, 2.0 - dvakrát zrýchlená, 0.5 o polovicu pomalšia).Úloha: Deklarujte v triede GameView.java premennú myGame typu Game, ktorá je kontextom pre daný View a inicializujte ju v init() metóde volaním getContext().Úloha: Upravte udalosti posunutia dlaždice tak, aby sa po presunutí dlaždice prehral zvuk. -
V tomto kroku sa naučíte ako vytvoriť a použiť jednoduchú animáciu "trasenia" v aplikáciách.Úloha: Vytvorte zdrojový adresár /res/anim, ktorý slúži na ukladanie vytvorených zdrojových súborov obsahujúcich definície animácií.Predpokladajme, že chceme, aby telefón vibroval, keď hráč úspešne vyrieši hru alebo sa pokúsi posunúť dlaždicu, keď je hra vyriešená. Existujú dva spôsoby ako rozvibrovať telefón - možete pristúpiť k vytvorenému servisu alebo si vytvoríte vlastnú animáciu znázorňujúcu vibrácie.
- Využitie dostupného servisu
Úloha: Vložte do manifestu aplikácie AndroidManifest.xml element uses-permission, ktorý povolí aplikácii prístup k zvolenému servisu atribútomandroid:name="android.permission.VIBRATE"
Úloha: Vytvorte v Aktivite src/tuke.fei.hello/Game.java verejnú metódu vibrate(), ktorá pristúpi k systémovému servisu pod menom VIBRATOR_SERVISE a uloží ho v objekte typu Vibrator.Poznámka: Prístup k servisu dosiahnete podobne ako pri audio manažérovi volaním metódy getSystemService(String).Úloha: Zavolajte na vytvorenom Vibrator objekte metódu vibrate(long) , ktorej parametrom bude doba trvania vibrovania.Úloha: Upravte udalosti posunutia dlaždice v triede GameView.java tak, aby sa pri vyriešení hry spustili vibrácie, prípadne aby sa spustili aj vtedy, keď hráč bude chcieť posunúť dlaždice v stave, kedy je hra už vyriešená.- Vytvorenie vlastnej animácie, ktorá "zatrasie" hracou plochou.
Úloha: Vytvorte zdrojový súbor /res/anim/shake.xml, v ktorom bude uložená animácia vibrovania, pri vytváraní zvoľte ako koreňový element translate s nasledujúcimi atribútmi.xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="10" android:duration="1000"
Poznámka: Element translate je používaný na posun do strán, v tomto prípade po osi X po dobu 1 sekundy, aplikovaním čoho dosiahneme efekt trasenia hracej plochy. Popisy ďalších použiteľných elementov nájdete preštudovaním doplnkových zdrojov uvádzných nižšie.V animáciách sa často využívajú interpolátory, tzv. modifikátory animácií definované v XML súboroch, ktoré umožňujú akceleráciu, opakovanie, rýchlosť animácie, atď. V prípade tejto animácie využijeme cyklický cycleInterpolator, ktorý zopakuje animáciu určený počet krát.Úloha: Vytvorte XML súbor /res/anim/cycle_interpolator.xml s koreňovým elementom cycleInterpolator s atribútmixmlns:android="http://schemas.android.com/apk/res/android" android:cycles="7"
Úloha: Pridajte do animácie atribút referujúci na zvolený interpolátor v atribúte android:interpolatorÚloha: Doplňte na príslušných miestach triedy src/tuke.fei.hello/GameView.java zavolanie animácie pomocou metódy startAnimation(Animation), ktorej parametrom bude načítanie vytvorenej animácia. Animáciu načítate volaním statickej metódy loadAnimation(Context, int) na triede AnimationUtils, ktorej parametrami je kontext daného View a id animácie získané zo zdrojov. -
Zväčšenie / zmenšenie objektu.Úloha: Vytvorte zdrojový súbor /res/anim/scale.xml, v ktorom bude uložená animácia zmenšovania, pri vytváraní zvoľte ako koreňový element set s elementom scale s nasledujúcimi atribútmi.
android:fromXScale="1.0" android:fromYScale="1.0" android:toXScale="0.5" android:toYScale="0.5" android:duration="3000"
Poznámka: Element scale je používaný na zmenu mierky, v tomto prípade po dobu 3 sekúnd sa z normálnej veľkosti bude objekt zmenšovať na velkosť polovičnú. -
Priehľadnosť.Úloha: Vytvorte zdrojový súbor /res/anim/alpha.xml, v ktorom bude uložená animácia znižovania priehľadnosti objektu, pri vytváraní zvoľte ako koreňový element set s elementom alpha s nasledujúcimi atribútmi.
android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="6000"
Poznámka: Element alpha je používaný na zmenu priehľadnosti, v tomto prípade po dobu 6 sekúnd sa objekt "vynorí" z prázdna, teda z priehľadného sa dostane do stavu úplne nepriehľadného. -
Priehľadnosť.Aby rotácia objektu bola plynulá, je vhodné využiť lineárny interpolátor.Úloha: Vytvorte zdrojový súbor /res/anim/lin_interpolator.xml, v ktorom bude uložený lineárny interpolátor, ako koreňový element zadajte linearInterpolator s atribútom
xmlns:android="http://schemas.android.com/apk/res/android"
Úloha: Vytvorte zdrojový súbor /res/anim/rotation.xml, v ktorom bude uložená animácia otáčania objektu, pri vytváraní zvoľte ako koreňový element rotate s nasledujúcimi atribútmi.xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" android:duration="5500" android:interpolator="@anim/lin_interpolator"
Poznámka: Element rotate je používaný na otáčanie, v tomto prípade po dobu 5,5 sekundy sa objekt bude otáčať o 360 stupňov okolo svojho stredu.
Doplňujúce úlohy
Ďalšie zdroje