TOPlist

Záznamy ze semináře o vývoji XNA her pro Windows Phone (2. část)

V druhém díle video seriálu o vývoji XNA her si rozpohybujeme objekty a ukážeme si ovládání pohybovým senzorem. Také se podíváme, jak na WP můžeme ukládat a načítat data.

Dnes se podíváme na druhou část záznamů ze semináře o vývoji her v XNA pro Windows Phone. Rozpohybujeme si objekty a ukážeme si ovládání pohybovým senzorem. Do hry si načteme jméno hráče z virtuální klávesnice a uložíme si ho. Tuto sérii zakončíme diskuzí, kde si povíme něco o možnostech 3D grafiky na Windows Phone.

Ještě, než se pustíme do sledování videí, zopakujeme si jedno dřívější téma, které jsme už na SmartManii částečně probrali ve 14. díle seriálu o XNA. Chtěl bych zde na jednom místě shrnout všechny hlavní přístupy, jak lze na Windows Phone ukládat a načítat data. Lidé si často nejsou jistí, který způsob použít, případně, co všechno si zde můžou dovolit. Snad tímto přispěji k určitému objasnění.

Ukládání a načítání dat na Windows Phone

Na Windows Phone není přístupný standardní souborový systém. Aplikace si může ukládat svoje data do určité paměti, aby si je mohla při dalším spuštění zpátky načíst. Může tam ukládat nejen jednotlivé datové položky, ale i soubory. Není tam ani žádné omezení na velikost zabraného prostoru. Tyto soubory jsou ale dostupné pouze této aplikaci. Ostatní programy se k nim nedostanou, nemají je jak přečíst. Je to určité omezení, každá aplikace běží v takzvaném odděleném sandboxu.

Pokud chtějí programy komunikovat mezi sebou, musí využít nějaké služby “v cloudu”, neboli nahrát si svoje data někam na internet a pak si je znovu stáhnout. Je možné, že toto omezení v budoucnu přestane být aktuální, pokud pro Windows Phone přibyde podpora takzvaných kontraktů. Ty už jsou dostupné například při vývoji pro Windows 8 metro. Toto omezení je zde především z bezpečnostních důvodů. Už z principu tedy nemůže nikdy pro Windows Phone vzniknout žádná aplikace typu prohlížeč souborů. Ze stejných důvodů ale naštěstí ani žádná jiná škodlivá virová aplikace :)

Pokud ale nepotřebujeme sdílet data mezi programy, prakticky na žádné další hranice nenarazíme. Pro ukládání a načítání dat můžeme zvolit několik přístupů. Většinou budeme potřebovat řešit dvě typové úlohy – po spuštění si načíst data do projektu (například s popisem herního levelu) a zpracovat je aplikací. Nebo si do aplikace po spuštění načíst soubory s nastavením, v případě změny je upravit a přímo za běhu aplikace je zpátky uložit.

Načítání souborů přímo po spuštění (pro čtení)

V prvním případě (pokud budeme chtít soubory jen načíst po startu, ne následně ukládat) si vložíme tyto soubory už přímo do projektu. V případě XNA Frameworku to provedeme přetažením do složky Content v paletce Solution Explorer, v případě Silverlightu kamkoliv jinam do složky projektu. Při kompilaci se potom tyto soubory zabalí do výsledného XAP instalačního balíčku. Budou to moci být obrázky s grafikou, soubory s popisem hry v XML apod.

Content Pipeline (XNA Framework)

V případě XNA Frameworku, pokud to bude známý formát souboru, pro jeho načtení budeme moci využít standardní Content Pipeline. To je nejjednodušší způsob načítání dat do projektu, kdy se o převod souborů do správného formátu postará samo XNA. Tímto způsobem jsme načítali například obrázky ve 4. díle seriálu, nebo později písma a zvuky. Co jsme si zatím neukazovali, že si pro Content Pipeline lze psát i vlastní rozšíření na další formáty souborů. I tentokrát to ale zatím přeskočíme, tento způsob má své specifické použití (dá se využít například pro načítání bounding boxů modelů ve 3D grafice).

Načítání pomocí streamů

Content Pipeline ale také můžeme úplně obejít a soubory si do projektu načítat napřímo pomocí streamů. To znamená, že se připojíme přímo na proud dat, který si potom budeme sami zpracovávat. Tento způsob využijeme například pro rychlejší načítání obrázků, jak jsme si ukázali ve 13. díle, nebo pro přímé načítání popisu herního levelu podle XML souboru. V případě XNA bude potřeba u všech takovýchto souborů změnit ve složce Content v paletce Solution Explorer jejich parametry Build Action na “None” a Copy to Output na “Copy if newer”.

Takovéto soubory budou napřímo beze změny zkopírovány do výsledného XAP balíčku. Tento způsob načítání dat je nejpodobnější standardnímu způsobu, který bychom používali na počítači. Pouze z důvodů specifického souborového systému je potřeba pro přístup k danému streamu použít trochu odlišné volání. Na počítači by se to dělalo takto:

FileStream fileStream = new FileStream("c:\\file.txt", FileMode.Open);

Na Windows Phone se místo toho použije třída TitleContainer (ze jmenného prostoru Microsoft.Xna.Framework):

Stream stream = TitleContainer.OpenStream("file.txt");

Kompletní kód pro načítání textového souboru po řádcích by mohl vypadat například takto:

try {
    using (Stream stream = TitleContainer.OpenStream("Content\\file.txt"))
    {
        using (StreamReader sr = new StreamReader(stream))
        {
            String line;
            while ((line = sr.ReadLine()) != null)
            {
                // Zobrazím načtenou řádku...
MessageBox.Show(line); } } } } catch (System.IO.FileNotFoundException) { }

Tento oddělený prostor pro data se nazývá Title Storage. Opakuji, že soubory do něj musí být umístěny už na začátku při kompilaci projektu. Také, že k těmto souborům je přístup pouze pro čtení, nemohou se za běhu upravit a znovu uložit.

Isolated storage

Druhý paměťový prostor, který máme na Windows Phone k dispozici, se nazývá Isolated Storage. Ten využijeme v druhém typovém případě – pokud si budeme chtít za běhu uložit z aplikace nějaká data. Mohou to být parametry nastavení, soubory stažené z internetu, nebo například vygenerované obrázky pro živé dlaždice.

V rámci Isolated Storage můžeme využít dva přístupy – takzvané IsolatedStorageSettings a IsolatedStorageFile. První objekt slouží pro ukládání jednoduchých datových položek, používá se stejně, jako C# kolekce typu Dictionary (je to takzvaná kolekce klíč/hodnota). Druhý objekt slouží pro ukládání a načítání souborů. Použití obou jsme si ukazovali ve 14. díle seriálu zde na SmartManii, určitý návod můžete vidět i zde v přiloženém 7. videu ze seminářů.

Pro ukládání do Isolated Storage opět existuje i několik pokročilejších přístupů, lze si například napsat automatickou serializaci celých objektů do XML souborů (bude ukázáno v 17. videu). Automatická serializace do binárního souboru bohužel na Windows Phone není možná, lze si ale pomoci některými externími knihovnami. Dobrou zkušenost mám například s knihovnou sharpSerializer. Obecně lze ke všem souborům uloženým v Isolated Storage plně přistupovat pomocí streamů, obdobně, jako to bylo v tom Title Storage.

State

Neměl bych zapomenout ještě na jeden objekt, který je na Windows Phone k dispozici. Tím je objekt State. Přistupuje se k němu podobně, jako ke kolekci IsolatedStorageSettings, slouží pro ukládání dočasného stavu aplikace při jejím uspávání na pozadí (při tombstoningu). Jeho použití bude prakticky ukázáno v 16. videu.

Další způsoby

Na Windows Phone jsou možné ještě další způsoby ukládání dat, kterým se tu už věnovat nebudeme. Položky si můžeme ukládat do SQL CE databáze, o tomto přístupu bude pojednávat chystaná série článků Pavla Valacha zde na SmartManii. Také pro uložení dat můžeme využít externí službu, jako například Windows Azure, nebo SkyDrive.

Launchers and choosers

Aby byl seznam kompletní, do naší aplikace můžeme dostat data ještě několika dalšími způsoby. Můžeme si například načíst fotku z fotoaparátu (i z přední kamerky, pokud ji dané zařízení má), nebo obrázek z galerie. Používají se k tomu takzvané Choosery, více se dá najít ve článku na MSDN. Z naší aplikace také můžeme například uložit obrázek do galerie, nebo do telefonu uložit vyzváněcí tón.

Autor článku Tomáš Slavíček
Tomáš Slavíček

Kapitoly článku