Sledujte nás na YouTube

MonoGame: Vývoj her pro Windows 8, Android a iOS (2. díl)

V minulém díle jsme si prošli krátký úvod do MonoGame frameworku a popsali jsme si platformu Windows Phone 8. Dnes se podíváme na vývoj pro zařízení se systémy Windows, Android a iOS.


Windows desktop

Pro běžné desktopové hry zůstává vývoj her v XNA stejný. Pokud už máte rozpracovanou hru pro Windows 7, na osmičkách vám bez problému poběží. Že se takto dají naprogramovat i kvalitní kousky, dokazuje například česká hra Miner Wars 2081, která byla také vytvořena v XNA. Desktopové hry si můžete umístit ke stažení například na svých webových stránkách, nebo můžete zkusit štěstí a nabídnout je k prodeji na nějakém větším portálu typu Intel AppUp, Desura, GoG, nebo Steam Greenlight. často zde ale mívají dost tvrdé podmínky na kvalitu, jinak vaši hru nepřijmou.

Pro desktopové XNA zůstává stále Visual Studio 2010, vývojové nástroje se nainstalují zároveň s Windows Phone SDK 7.1. Ve Visual Studiu 2012 byly problémy, že se tam správně neinicializovaly šablony projektů. Pokud budete chtít toto SDK instalovat na Windows 8, bude také potřeba doinstalovat navíc balíček Games for Windows Marketplace Client, jinak XNA nebude fungovat korektně.

Že už XNA není úplně podporované, je občas vidět i na desktopových aplikacích. Není zde například podpora pro ovládání pomocí dotyků, pokud spustíme hru na notebooku s dotykovým displejem, načítání vstupu pomocí TouchCollection nebude fungovat korektně. Dá se to řešit pomocí Windows 7 Multitouch Interop Library, jen si je potřeba pohlídat synchronizaci načítání dotyků s metodami herní smyčky (během jednoho snímku může být zavoláno .Pressed a ještě několikrát .Moved) a také dát pozor na aktuální nastavené DPI systému.

Windows 8 / RT

Windows 8 přichází navíc s koncepcí takzvaných Windows Store aplikací. To jsou celoobrazovkové aplikace, které běží v rámci nové nabídky Start, uživatel si je může nainstalovat právě z vestavěného obchodu Windows Store. Tyto aplikace běží nad úplně novým API zvaným WinRT, které přináší určitou náhradu či alternativu staršímu Win32 API. Aplikace psané nad WinRT jsou optimalizované pro nízkou spotřebu baterie, není u nich například standardní multitasking, jak ho známe z desktopu. Model spouštění a uspávání aplikací na pozadí připomíná více mobilní telefon – na displeji může být v jednu chvíli pouze jedna nebo maximálně dvě aplikace, ostatní jsou uspané na pozadí. Hlavním cílem je, aby vše dobře běželo i na slabých tabletech s procesory Atom nebo ARM a nespotřebovávalo moc baterie.

 

Jen pro upřesnění, můžeme si zde všimnout dvou podobných názvů: WinRT a Windows RT. WinRT je již zmiňované běhové prostředí pro Windows Store aplikace. Windows RT je oproti tomu speciální verze Windows 8 pro tablety a zařízení založené na platformě ARM. Windows RT sice vypadá prakticky stejně jako Windows 8, také nabízí desktopový mód, ale ten je zablokovaný pro instalaci vlastních aplikací. Jedinou možností, jak tam nainstalovat hru, je do nabídky Start přes Windows Store. Což je velká příležitost pro vývojáře :).

Zástupcem rodiny zařízení se systémem Windows RT je například první tablet Microsoft Surface (pozn. jak jistě víte, není tím myšlen ten interaktivní stůl uvedený v roce 2008, ale 10,6″ zařízení stejného jména, uvedené v létě 2012).

 

WinRT API

V novém WinRT API se nachází poměrně hodně změn, které mohou na první pohled překvapit. WinRT je nativní neřízené (unmanaged) API založené na COM. Nad tímto API se nachází projekce jednotlivých jazyků, dostupný je nativní jazyk C a C++, jazyk C# a VB.NET a aplikace je možné psát i v HTML a JavaScriptu. Jednotlivé aplikace napsané nad WinRT běží v sandboxu, tj. nemůžou se navzájem ovlivňovat a například si mazat data (výjimkou jsou jen přesně definované kontrakty). Veškeré operace, které by mohly trvat déle jak 50ms, se dají z kódu volat pouze asynchronně. Pro komunikaci se sítí, stahování dat, ukládání souborů, nebo jen pro obyčejné zobrazení dialogového okna (obdoba MessageBox), jsou zde dostupné nové příkazy (v tomto případě MessageDialog). Pro jednodušší volání těchto asynchronních metod se používají nová klíčová slova async a await.

Máme k dispozici jazyk C# a již zmíněná projekce nám pomáhá, aby náš kód vypadal co nejpodobněji, jako dřív. Nemáme dostupný ale plný .NET Framework, jen určitou jeho podmnožinu (podobně, jako to bylo v Silverlightu). Občas narazíme na to, že některé jmenné prostory se jmenují jinak, nemáme k dispozici objekt typu Thread, místo IsolatedStorage je zde trochu jiné Windows.Storage, nebo že jazykový resource soubor má odlišnou koncovku, než míval na Windows Phone 7. Vývojář by měl prostě zůstávat pořád ve střehu, aby nezakrněl :)

Jen pro upřesnění – na Windows Phone 8 se také nachází část WinRT API, označuje se jako WinPRT. Není zde úplná kompatibilita, některé funkce jsou navíc na WP8, některé na Windows 8. Pro sdílený kód mezi oběma platformami se používají takzvané Portable Class Libraries.

Windows Store aplikace

Naše hra pro Windows Store by měla být schopna běžet na všech možných zařízeních, od dotykového tabletu až po desktopový počítač s velkým monitorem. Měla by jít ovládat myší, klávesnicí, prsty i stylusem. Musíme pamatovat i na různá rozlišení obrazovky a DPI monitorů, i na to, že tyto parametry se mohou změnit i během hry (připojíme si k notebooku externí monitor). Na tyto všechny záležitosti se určitě podíváme v příštích dílech, i jak řešit různé dialogy a integraci do systému, nebo přípravu balíčku na Windows Store.

Registrace do Windows Store stojí 49 USD na rok, studenti registrovaní na DreamSpark tento poplatek opět nemusí platit, stejně tak, jako majitelé MSDN a TechNet předplatného.

Android

Jedna z nejúžasnějších věcí na MonoGame je jeho multiplatformnost :) Téměř se stejným úsilím dokážeme naši hru naportovat na nový Windows Phone 8, Android, nebo třeba iPhone. Na Androidu nebo iOS se skrývá pouze jediná záludnost, pro běh MonoGame je potřeba mít licenci i na implementaci jazyka C# a na pomocné vývojové nástroje – Mono for Android od Xamarinu, respektive MonoTouch v případě iOS. Je dostupná i free verze na odzkoušení, s tou ale nejdou testovat hry na skutečném telefonu, ani potom nejdou umístit na Google Play / App Store. Plná verze Mona stojí 400 USD pro každou platformu, je to licence na 2 (případně 3) vývojářské počítače, za tuto cenu garantují aktualizace po dobu jednoho roku. Studentská licence naštěstí vyjde levněji, jen na 79 USD. Registrace do Google Play potom stojí 25 USD.

 

Na druhou stranu se ale musí říct, že nástroje vypadají poměrně slušně, stejně tak i jejich přiložená dokumentace. V případě MonoDroidu se integruje do Visual Studia například panel pro přepínání připojených zařízení a emulátorů. Ve vlastnostech projektu jdou zaklikávat potřebné permissions a další vlastnosti Android manifestu. Můžeme zde například volit minimální hodnotu cílového API. Pro informaci, ve výchozím nastavení běží MonoGame nad Target API 10, což znamená podporu všech zařízení s Android verze 2.3 nebo novějším. Tím je aktuálně zaručena dostupnost na přibližně 90% telefonů a tabletů s tímto systémem.

Dalvik a Mono for Android

Zkusme si poodhalit, jak MonoGame na Androidu přesněji funguje. Pro běžné aplikace běží nad linuxovým jádrem těchto telefonů virtuální stroj Dalvik. Androidí aplikace jsou většinou psané v jazyku Java. Před instalací na zařízení se tyto Javové knihovny převádí do formátu .dex (Dalvik Executable). To je mezijazyk, obdobný jako CIL v .NETu. Dalvikovský kód se potom vykonává just-in-time tímto virtuálním strojem.

 

Mono for Android není postavené nad Dalvikem, ale je umístěné “vedle něj”. Je to také běhové prostředí nad linuxovým jádrem. Díky němu dokážeme spouštět náš kód napsaný v jazyce C#. Přes Dalvika i přes Mono jsou zpřístupněná různá systémová API. Můžeme volat funkcionalitu ze jmenných prostorů System.IO, System.Net apod., budou podle toho automaticky volány odpovídající funkce linuxového systému. Pro náš herní kód si většinou vystačíme s dodanými .NET knihovnami a jazykem C#.

Občas budeme chtít ale využít nějaké externí knihovny. Budeme si chtít například logovat informace z aplikace, nebo využít službu pro odesílání skóre online. Obecně máme několik možností. Buï seženeme danou knihovnu překompilovanou přímo pro MonoDroid (má to tak například Playtomic, nebo Photon Cloud), nebo si stáhneme zdrojáky v C# a knihovnu si překompilujeme sami (viz například Mogade). Pokud najdeme dostupnou knihovnu pouze v Javě, budeme si muset napsat wrapper. Takováto Javová knihovna poběží nad Dalvikem, my si pouze napojíme volání ze C# na její odpovídající metody. Takový případ je například Flurry, to má dostupnou knihovnu pro Android pouze ve formátu .jar. Bez dalšího zabíhání do detailů – existují na to dvě technologie: JNI a Java Binding Library. Funkční napojení metod na Flurry pomocí JNI si můžete stáhnout například zde.

MonoGame na Androidu

Samotné MonoGame je potom knihovna, která běží nad Mono for Android. Pro vykreslování se používá OpenGL ES 2.0 (tohle API je dostupné právě od Androidu 2.3). Co je potřeba opět řešit, jsou různá rozlišení Androidu. Můžeme najít telefony s malým displejem, malým rozlišením a slabým výkonem, ale i supervýkonná supermonstra. Pamatujme také na to, že hra může běžet i na tabletech, měli bychom ji optimalizovat i na velké displeje. Systém Android můžeme najít dokonce i v některých televizích. O tom, jak v MonoGame řešit správně rozlišení na Androidu, se můžete dočíst například na tomto blogu.

iPhone a iPad

Vývoj pro iOS pomocí MonoGame je v mnohém podobný vývoji na Android. Také je potřeba zakoupit MonoTouch od Xamarinu za 400 USD, respektive 79 USD pro studenty. Roční poplatek na App Store přijde na 99 USD. Je zde ale ještě jedna věc navíc, se kterou musíme počítat. Hra pro iPhone nebo iPad se dá zkompilovat pouze na Macu. Vyvíjet a testovat v prostředí Windows není možné (kromě pochybných pokusů typu Hackintosh). Musíme tedy pro začátek počítat s větší investicí. Velikost a atraktivnost cílového trhu nám to ale určitě vynahradí. Na App Store je sice aplikací a her už hodně, ale když se nějakému vývojáři přeci jenom povede prosadit, může si chvíli opravdu užívat. Uživatelská základna je hodně velká, lidé jsou také více ochotní platit.

Na rozdíl od Androidu zde na telefonech neběží běhové prostředí Mono, ale aplikace jsou kompilovány napřímo do strojového kódu platformy. Jádro iPhone totiž nepovoluje běh just-in-time kompilátorů. Je možné ale opět využít již existujících knihoven, na stránkách MonoTouch je ke stažení už mnoho připravených bindingů (například pro Flurry, Google Analytics, TapJoy apod.).

Ohledně rozlišení displejů je na tom iPhone velmi podobně, jako Windows Phone 8. Jsou zde aktuálně dostupná tři různá rozlišení a dva různé poměry stran. Nesmíme také zapomínat na iPad, ve kterém se mohou nacházet dva typy displejů, s XGA rozlišením 1024×768, nebo s dvojnásobnou “Retinou”. Další záležitosti si zmíníme ještě v příštím díle, pro poslední verzi MonoGame na iOS je potřeba například předzpracovávat písma typu SpriteFont jinak, než pomocí standardní XNA Content Pipeline.

Tomáš Slavíček

5 komentářů

  1. jankolu (neregistrovaný)

    Existuje nějaký rozumný framework, ve kterém bych udělal palikaci pro všechny tři platformy? Nechci nějaké složité grafické záležitosti. Jednalo by se mi v podstatě o aplikaci s textem, obrázky, videem… Taková HTML stránka. Dík Honza

    • Tomáš Slavíček (neregistrovaný)

      Pokud chcete zkusit přímo HTML, podívejte se na framework PhoneGap [odkaz] Dobrá aplikace by měla ale dobře graficky zapadat na každou platformu (př. vzhled Android vs. Windows Phone), takhle bude vypadat všude stejně.

  2. Demi (neregistrovaný)

    Dobrý den,

    toto je otázka přímo na autora článku: Máte nějakou zkušennost s Android ECLIPSE a Android SDK? Potřeboval bych pomoct s pár věcmi.

    • Tomáš Slavíček (neregistrovaný)

      Na drobné Javové projekty jsem zatím používal jen NetBeans. Do Android SDK postupně pronikám, ale spíš z pohledu Mono for Android. Zkuste ale napsat dotaz, možná se tu nějací Android vývojáři najdou, co poradí…

  3. DEMI (neregistrovaný)

    Dobrá tedy: chci si vytvořit jednoduchou aplikaci na androida kde se bude zobrazovat obrazek, který budu moci přibložovat,nebo oddalovat a v přiblížení s ním posouvat. Potřebuji k tomu znát nějaké složité programování, nebo jazyky?

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *