Sledujte nás na YouTube

Vyvíjíme pro WP v XNA: Portace hry na PC a Xbox 360 (15. díl)

V posledním díle našeho obsáhlého seriálu o vývoji her pro WP v XNA se podíváme na to, jak můžete tituly portovat na PC a Xbox 360.

V dnešním díle seriálu o vývoji her pro Windows Phone se podíváme na to, jak se dají hry upravit, aby běžely na Xboxu 360 nebo na PC. Ukážeme si hlavní rozdíly mezi těmito platformami. Na konci se krátce zamyslíme nad aktuální situací XNA Frameworku a nad jeho budoucností.    

ve třetím díle našeho seriálu jsme si popisovali, že se v XNA mohou vytvářet hry pro telefony se systémem Windows Phone, pro hudební přehrávače Zune, herní konzole Xbox 360 nebo počítače se systémem Windows. Hry v XNA dokonce mohou spolupracovat se Silverlightem a běžet přímo ve webovém prohlížeči. Naportovat hru z jedné platformy na druhou není nijak složité, je potřeba udělat jen několik drobných změn v kódu. Mezi hlavní rozdíly mezi těmito platformami patří různé velikosti displejů s různým rozlišením, rozdílné způsoby ukládání dat a specifické způsoby ovládání.

-

Pokud se rozhodneme naportovat naši mobilní hru na některou z těchto “velkých” platforem, určitě budeme muset vzít v potaz velikost obrazovky. Monitor počítače nebo domácího kina bude mít až desetkrát větší úhlopříčku, než telefon. Rozdílné bude také rozlišení (na Xboxu až 1920×1080 pixelů), případně poměr stran (v případě Xboxu 4:3, 16:9 nebo 16:10). Pokud budeme předpokládat, že hra poběží i na běžných televizních obrazovkách, budeme muset vzít v potaz i takzvanou bezpečnou zobrazovací oblast. Na klasické CRT obrazovce bude vždy určitá část obrazu po stranách skryta a nebude se zobrazovat. Tuto bezpečnou oblast si budeme moci zjistit z položky TitleSafeArea (typu Rectangle):

GraphicsDevice.Viewport.TitleSafeArea

Naše ukazatele skóre a další důležité prvky bychom si měli vždy umístit do této bezpečné oblasti. Měli bychom si také dát pozor na velikost písma, neměli bychom v takovýchto hrách používat objekty SpriteFont s menším nastavením, než 14 bodů. Pro PC nebo Xbox si většinou budeme chtít upravit i grafiku hry, textury si připravíme ve vyšším rozlišení, nebo použijeme detailnější modely. Často si také zvolíme například větší záběr kamery na herní plán, aby se nám na větší obrazovku vešlo více objektů.

Mezi platformami se bude lišit také způsob ukládání dat. Isolated Storage najdeme bohužel jen na telefonu, na Xboxu nebo PC využijeme takzvané User Storage. Na Xboxu bude možné volit, jestli se data uloží na paměťovou kartu, nebo na připojený harddisk (velikost těchto ukládaných dat je na Xboxu omezena na 52 MB, celá hra by se potom měla vejít do 2 GB).

-

Posledním velkým rozdílem bude odlišný způsob ukládání. Na telefonu se bude hra ovládat dotykovým displejem, případně naklápěním, na Xboxu tlačítky a gamepady, na počítači klávesnicí a myší. Naštěstí i v tomto nám XNA vyjde poměrně vstříc. Jak už jsme si ukazovali v 7. článku, jednotlivé dotyky na displeji telefonu bude možné odchytávat úplně stejně, jako klikání myší na počítači. Kompatibilní bude dokonce i druhý způsob ovládání pomocí objektu TouchPanel. Pokud se k počítači připojí multidotykový monitor, bude možné hru ovládat více dotyky a gesty úplně stejně, jako by běžela na telefonu.

Portace hry na PC/Xbox 360

Jako příklad si ukážeme, jak se dá od projektu pro Windows Phone odvodit hra pro počítač. Klikneme pravým tlačítkem na název projektu v paletce Solution Explorer a zvolíme Create Copy of Project for Windows. Do našeho solution se nám přidá druhý projekt s názvem Windows Copy of Project. Uvidíme v něm stejné soubory, jako v původním Windows Phone projektu. Tyto soubory s kódem budou sdílené mezi oběma projekty.

-

Budeme chtít, aby se některé části kódu prováděly pouze na telefonu, ne na počítači. Budou to především části zpracovávající vstup z akcelerometru, nastavující orientaci displeje, řešící ukládání do Isolated Storage apod. Pro jejich odlišení využijeme takzvané direktivy. Kód, který by se měl provádět pouze na vybrané platformě, obalíme příkazy #if a #endif:

#if WINDOWS_PHONE 
    IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
    //...
#endif

Když si zavřeme upravený soubor s Windows Phone kódem a otevřeme si ho z odvozeného Windows projektu, uvidíme tyto řádky jako zašedlé, neaktivní:

#if WINDOWS_PHONE
    //IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings; //... #endif

Projekt pro Windows si budeme moci spustit. Klikneme pravým tlačítkem v paletce Solution Explorer na název tohoto projektu, zvolíme položku Set as StartUp Project. Po zkompilování a spuštění projektu by nám už měla naběhnout PC verze. Pokud se objeví ještě nějaké nekompatibilní části kódu, které bychom měli obalit direktivami, upozorní nás na ně kompilátor.

Obdobně si budeme moci zadat i opačnou podmínku a odlišit tak kód, který by měl běžet jen na PC nebo Xboxu. Do metody Update() si například vložíme ošetření vstupu z gamepadu:

#if WINDOWS || XBOX
    GamePadState gs = GamePad.GetState(PlayerIndex.One);
    if (gs.ThumbSticks.Left.Y > 0f)
    {
        //...
}
#endif

Pokud se rozhodneme převést naši hru na Xbox 360 a spustit přímo na něm, bude to také možné. Pro zprovoznění budeme potřebovat mít aktivní účet na App Hubu, stejně jako v případě Windows Phone. Bude nám stačit i studentský účet ověřený přes Dreamspark. Xbox propojíme kabelem s počítačem. Stáhneme si do něj aplikaci XNA Game Studio Connect, přímo z marketplace. Je k dispozici zdarma, jen je potřeba mít pro její stažení nastavené americké LIVE ID. Tuto aplikaci si na Xboxu spustíme, zobrazí se nám 25místný kód.

Pokračovat budeme na počítači. Z nabídky Start si spustíme program XNA Game Studio Device Center, v otevřeném dialogu si vybereme přidání Xboxu a vyplníme požadovaný kód. Po konečném spárování si už budeme moci naši hru přímo z Visual Studia zkompilovat a spustit. Podrobnější návod najdete například v článku na MSDN, ve svém videu tento postup také popisoval Martin Kaše – jak si upravit hru vytvořenou podle tutoriálu na serveru CzechGamer.com.

Je nutné ještě připomenout, že český účet na App Hubu nám zatím bohužel nebude stačit k tomu, abychom mohli hru nahrát na marketplace a nabídnout ji ke stažení v rámci Xbox LIVE Indie Games. To je zatím povolené pouze z vybraných zemí (například z Velké Británie nebo z USA), také je nutné mít zakoupený plný vývojářský účet za $99 USD, ne pouze ten studentský.

Reach vs. HiDef profil

Pro odlišení grafických možností jednotlivých platforem byly v XNA 4.0 uvedeny takzvané grafické profily Reach a HiDef. Udávají sadu parametrů, které musí daná platforma podporovat. U daného projektu se tento profil může přepnout v nastavení (pravým tlačítkem v paletce Solution Explorer na název projektu a zvolením Properties).

Reach profil udává rozsah funkcí dostupných na Windows Phone. Oproti plné sadě funkcí tam není tolik omezení, které by nám vadily. Dobré je pamatovat na maximální velikost textur (2048×2048 pixelů), případně na maximální počet trojúhelníků, které je schopna grafická karta vykreslit za jedno volání (65 tisíc). Pro velmi podrobnou tabulku se můžete podívat na stránky Shawna Hargreavese.

-

HiDef je oproti tomu předvolen jako výchozí profil pro PC a Xbox 360. Protože už vyžaduje některou speciální funkcionalitu, jednou z podmínek je, že pro běh her je nutné mít grafickou kartu s podporou alespoň DirectX 10. Pokud v naší hře ale nebudeme potřebovat žádnou z odkazovaných speciálních vlastností, bude nám stačit přepnout PC i Xbox verzi hry na profil Reach. Díky tomu bude naše hra schopna běžet i na slabších počítačích, zachováme si tím také plnou kompatibilitu s Windows Phone.

Vestavěné efekty v XNA 4.0

Hlavním rozdílem Windows Phone oproti PC nebo Xboxu je nemožnost psaní vlastních shaderů. To jsou speciální kódy v jazyce HLSL, které se neprovádí na procesoru, ale jsou vykonávány přímo grafickou kartou. U jednoduchých 2D her nejspíš na jejich potřebu nikdy nenarazíme, u implementace různých pokročilých efektů ve 3D scéně nám ale možná budou chybět. Pomocí shaderů se dají vytvářet například dynamické stíny, dá se prolínat více textur dohromady, nebo se mohou simulovat speciální efekty, jako rozostření obrazu, přesvícení obrazovky a podobně.

-

Spolu s XNA 4.0 naštěstí bylo uvedeno alespoň několik připravených efektů. Pro více podrobností se můžete podívat na přednášku prezentovanou na konferenci MIX10 (v angličtině). Mimo základní efekt BasicEffect, používaný ve 3D grafice pro zobrazování modelů a dalších objektů, byly připraveny i další efekty. DualTextureEffect slouží ke spojování dvou textur dohromady, mohou se pomocí něj zobrazovat na objektech například předem předpočítané stíny. Tento efekt se dá také využít například k zobrazování druhé detailnější textury při velkém přiblížení kamery k objektům. Mezi další zajímavé efekty patří například EnvironmentMapEffect, který umožňuje nasimulovat lesklý povrch materiálu, ve kterém se odráží jiné objekty.

Dostupné knihovny

Pokud se rozhodnete vytvářet hru pro Windows Phone, v dnešní době už budete moci využít i několika připravených knihoven, které se vám postarají o správu obrazovek, objektů, nebo vám pomohou doplnit do XNA další funkcionalitu. Mezi aktuálně dostupné herní 3D engine se řadí například SunBurn engine (zpoplatněn $250 USD), nebo multiplatformní Delta Engine. Pro vykreslování neherních obrazovek (menu, nastavení apod.) se dá dobře využít kombinace Silverlightu a XNA. Pro simulaci fyziky je možné použít knihovnu Box2D.XNA, nebo například Farseer Physics Engine (obě jsou k dispozici zdarma). Online sdílení skóre a implementace achievementů se dá jednoduše naimplementovat pomocí služby na webu mogade.com (mají tam návod i přímo pro XNA).

XNA včera, dnes a zítra

První verze XNA Frameworku byla uvedena v roce 2005. Tato technologie byla již od začátku cílená především na jednotlivce a malá herní studia, vývojářům zpřístupnila možnost jednoduchého vývoje her pro Xbox 360. Verze XNA 4.0 přinesla i podporu pro Windows Phone telefony, přibyla možnost použití připravených vestavěných efektů, bylo provedeno několik dalších změn a vylepšení. Spolu se Silverlightem se tato technologie zařadila mezi dva způsoby, jak se dá programovat pro Windows Phone. Poslední velkou novinkou bylo uvedení možnosti propojení Silverlightu a XNA, které umožnilo zobrazování 3D grafiky přímo ve webovém prohlížeči. Pomocí XNA si je možné vytvořit hru i pro interaktivní stůl Surface, nebo takovou hru, která bude využívat pohybový senzor Kinect (připojený k počítači).

Tento podzim se na téma XNA poněkud rozvířily diskuze, když byly na konferenci BUILD odhaleny první podrobnosti o novém systému Windows 8. Ten by se měl skládat ze dvou “oddělených” prostředí, z klasického desktopu a z Metro části (vypadající podobně, jako prostředí Windows Phone). Díky tomuto prostředí by měl být systém dobře ovladatelný i na dotykových tabletech. Pro běh v Metru ale budou muset být aplikace speciálně upraveny. Mezi podporovanými technologiemi zatím XNA nebylo oznámeno, uvidíme, zda tam jeho podporu postupně doplní. Bylo by škoda, kdybychom si naši hru nemohli jednoduše naportovat i na tento zajímavý typ zařízení (v tabletech založených na technologii ARM se nejspíš bude nacházet pouze Metro prostředí).

Určitě bude zajímavé sledovat další vývoj XNA, u Windows Phone se určitě ještě dlouho udrží jako jedna z hlavních technologií. Uvidíme, jaké změny přinese uvedení nového Xboxu, jestli tam tato možnost vývoje také zůstane. Je možné, že XNA pro Windows 8 zatím bylo jen pozdrženo, protože ještě nebylo úplně připravené. Možná se ještě upravuje pro běh nad novější verzí DirectX a s jeho uvedením se čeká právě až na oznámení nového Xboxu. Bude určitě zajímavé sledovat nadcházející vývojářské konference.

Závěr

Toto je prozatím poslední díl seriálu zabývající se vývojem her pro Windows Phone. V celkem 15+1 článcích jsme si postupně přiblížili tuto platformu a zkusili jsme si vytvořit jednoduchou hru. Popsali jsme si mnoho zajímavých tipů, od různých způsobů ovládání hry, přes zobrazování grafiky a přehrávání zvuků, až po ukládání a načítání souborů.

Věřím, že jste zde našli mnoho nových informací. Budu rád, když mi do komentářů napíšete jakékoliv názory nebo připomínky, nebo i nápady na možná pokračování. Rádi si prohlédneme i vaše vlastní výtvory, budete se s nimi moci pochlubit například na našem fóru.

Na závěr ještě připomínám další zdroje a návody v češtině o vývoji her v XNA – dva tutoriály na serveru CzechGamer.com, sérii screencastů na youtube.com, případně další odkazy v tomto rozcestníku. Můžete si také prohlédnout moji bakalářskou práci na téma Herní 3D engine pro Windows Phone.

O autorovi článku

Studuji Matematicko-fyzikální fakultu UK v Praze, věnuji se platformě .NET a programování v C#. Tvořil jsem pro Windows Mobile, nyní se věnuji především platformě Windows Phone 7. Zajímám se o návrh her a další multimediální tvorbu, dokončuji vývoj herního 3D engine postaveného nad XNA. Ve volném čase si najdu rád chvilku na in-line brusle, nebo na hraní na klávesy. Na škole působím jako Microsoft Student Partner.

Tomáš Slavíček

3 komentáře

  1. Pepa (neregistrovaný)

    Měl bych dotaz. Video z [odkaz] jsem si stáhnul a krokoval po snímcích. Přijde mi, že asteroidy mizí skutečně až po nárazu střely (že se bere ohled na tvar asteroidu – neprůsvitné části obrázku). Jak je to možné, když kolize se vyhodnocují protínáním obdélníků? Nebo tak špatně vidím? :)

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

      V mé hře jsem si provedl několik vylepšení :) Kolize mezi střelami a asteroidy posuzuji jako kolize obdélníku a kruhu. Stejně tak kolize mezi raketkou a asteroidy posuzuji přesněji (podle tvaru raketky).

    • Pepa (neregistrovaný)

      Tomáš Slavíček: Díky, vrtalo mi to hlavou už dlouho :)

Napsat komentář

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