TOPlist

MonoGame: Instalace frameworku, hlavní rozdíly oproti XNA (3. díl)

Dnes se pustíme naplno do praxe, ukážeme si jak tento framework nainstalovat a nastavit. V druhé části článku si projdeme rozdíly MonoGame a XNA a upřesníme si, na co dát při vývoji pozor.

V předchozích dvou dílech jsme si prošli hlavní vlastnosti platforem, pro které jdou vytvářet hry v MonoGame. Dnes se pustíme naplno do praxe, ukážeme si jak tento framework nainstalovat a nastavit. V druhé části článku si projdeme rozdíly MonoGame a XNA a upřesníme si, na co dát při vývoji pozor.

Instalace MonoGame

MonoGame můžeme do počítače dostat dvěma způsoby. Na stránkách projektu na CodePlexu je dostupný automatický instalátor. Ten nahraje do počítače poslední verzi frameworku označovanou jako stabilní. V současné době je to verze 3.0 beta, z října minulého roku. Je to nejjednodušší možnost instalace, většinou se zde ale nenachází aktuální zdrojáky a šablony projektů. V současné době tento způsob nejde použít například pro Windows Phone 8.

Můžeme si ale stáhnout nejnovější zdrojové kódy přímo z Githubu. Na této stránce stačí kliknout na tlačítko ZIP a stáhnout si soubory do počítače. Můžeme si zde také vybrat z několika vývojových větví, nás bude ve většině případů zajímat branch develop3D.

 

Dále budeme potřebovat stáhnout ještě obsah repozitáře MonoGame-Dependencies z tohoto odkazu. Opět zde klikneme na tlačítko ZIP, soubory si umístíme do MonoGame\ThirdParty\Libs. Pokud budeme chtít, stáhneme si i připravené vzorové projekty (samples), nebo Starter kity.

Nyní si budeme chtít přidat nové šablony projektů do Visual Studia. Ve stažené složce MonoGame se podíváme do složky ProjectTemplates a otevřeme si obsah vybrané složky, například \VisualStudio2012\WindowsPhone (podle toho které Visual Studio máme nainstalované a pro jakou platformu chceme vyvíjet).

Obsah této složky si zazipujeme jako jeden soubor a umístíme ho do složky Dokumenty\Visual Studio 2012\Templates\ProjectTemplates\Visual C# (opět podle verze našeho Visual Studia). Když si nyní založíme nový projekt, šablonu tam už uvidíme.

 

Klikneme na OK a založíme si nový projekt. Pokud se ho pokusíme spustit, ještě nám fungovat nebude. V paletce Solution Explorer klikneme pravým tlačítkem na Solution a vybereme Addó>Existing Projectš Ze stažené složky MonoGame\MonoGame.Framework vybereme odpovídající .csproj soubor (tj. v tomto případě ten pro Windows Phone). Ještě tyto dva projekty spolu provážeme ñ pravým tlačítkem na našem projektu zvolíme Add Reference a vybereme přidané MonoGame.

Zkusíme projekt zkompilovat a spustit, mělo by vše už proběhnout správně. Pokud se objeví nějaké chyby, například chybějící knihovny SharpDX, zkontrolujte si, že jste vše správně stáhli a propojili. V projektu MonoGame by neměly být žádné reference podtržené červeně.

To, že máme přímý přístup ke zdrojákům MonoGame, má velkou výhodu. Vždy se můžeme pohodlně nakouknout, jak je to uvnitř řešené. Občas si v nich také budeme chtít něco upravit, protože ne vždy se MonoGame bude chovat úplně 100% jako XNA. Vzhledem k překotnému vývoji tam občas budou nějaké chybky, novou aktualizací by se mohlo něco rozbítš Bude výhodné, pokud si budeme udržovat nějakou vlastní odzkoušenou verzi zdrojáků.

Vykreslení obrázku

Abychom si rovnou odzkoušeli takové Hello world, zkusíme si vykreslit obrázek. První, čeho si možná všimneme, že zde není žádný projekt typu Content. MonoGame zatím nenabízí plnohodnotnou Content Pipeline, která by dokázala automaticky převádět obrázky, hudbu, nebo texty do interního formátu .xnb. Do MonoGame nestačí přetáhnout tyto multimediální soubory, musí se nejdřív překonvertovat pomocí XNA. Založíme si tedy vedle ještě druhý projekt (klasickou XNA hru), vložíme tam dané obrázky a zavoláme Build. Převedené .xnb soubory potom najdeme ve složce \Bin\Release\Content projektu.

Přepneme se zpátky MonoGame a založíme si v projektu složku Content. Do ní si přetáhneme převedené .xnb soubory. V jejich vlastnostech nastavíme Build Action na íContentî a Copy to Output na íCopy if newerî (viz obrázek).

 

Nyní už si můžeme vykreslit obrázek, standardně, jako v XNA. Na začátek si vložíme deklaraci textury:

Texture2D texture;

V metodě LoadContent si do ní načteme obsah:

texture = Content.Load<Texture2D>("monogame_logo");

A v metodě Draw si ji vykreslíme:

spriteBatch.Begin();
spriteBatch.Draw(texture, new Vector2(0, 200), Color.White);
spriteBatch.End();

Základy XNA si můžete připomenout v prvních dílech předchozího seriálu o vývoji her.

Rozdíly XNA a MonoGame

Na první dva základní rozdíly mezi XNA a MonoGame jsme už narazili. Není zde přítomná plnohodnotná Content Pipeline. A také, že MonoGame není oficiální projekt Microsoftu, ale je to neustále se rozvíjející dílo komunity. Kromě hlavní vývojové větve existují i různé vedlejší. Některé věci tam zatím nejsou naimplementované, nebo se chovají trochu podivně. Funkcionalita naštěstí přibývá každým dnem a dovoluji si tvrdit, že pro běžné 2D hry se už dá na MonoGame bez problémů spolehnout. Pokud narazíte přeci jen na nějakou chybu, můžete jim ji nareportovat na jejich Issues list na GITu, určitě se jí budou věnovat.

V prvních verzích MonoGame, zvláště na Windows 8, zlobila podpora dotyků a gest. Když člověk odzkoušel dotyky na reálném tabletu, hra z nepochopitelných důvodů občas padala. I v dnešní době raději doporučuji načítání dotyků pomocí TouchCollection obalit voláním try/catch. Stejně tak gesta občas nechodila správně, když člověk klikal dvěma prsty, detekovalo se to jako pinch gesto apod. Mohlo to být ale také způsobeno předprodukčním hardware, na kterém jsem testoval.

Co někoho může zaskočit, že je na Windows 8 nutné řešit vstup pomocí dotyků a myši zvlášť. V kolekci TouchCollection se objevují jen skutečné dotyky prstem, dotyky pomocí myši nebo stylusu najdeme pouze v kolekci Mouse.GetState. Ideální je, pokud si je vždy slijeme do jednoho pole, aby se nám s nimi lépe pracovalo (podrobněji je to popsané v odkazované přednášce na konci článku).

Občas mohlo překvapit trochu nestandardní chování objektu graphics. Na některých platformách po změně rozlišení a zavolání graphics.ApplyChanges hra padala. Na Windows 8 v určitých verzích MonoGame tento příkaz ani nebyl potřeba volat, grafický buffer se přepočítával správně i bez toho. Tohle je vždy o drobném experimentování, případně nalezení správného návodu na internetu. Jak jsem už zmiňoval, například článek o správném přepínání rozlišení na Androidu můžete najít zde.

V MonoGame zatím také chybí některé pokročilé funkce XNA. Základní podpora pro 3D grafiku tam už sice je, ale například podpora shaderů je velmi omezená. Pokud už něco funguje, nemusí to být zrovna optimálně rychlé. Občas také jediné, co se nám vrátí po zavolání určité metody, je výjimka NotImplementedException.

Tento projekt se ale vyvíjí opravdu rychle, takže co nejde dnes, zítra už může bez problémů fungovat :). Pokud některé části MonoGame nevěříte, vždy máte možnost se podívat do zdrojáků XNA (například pomocí Telerik JustDecompile) a případným kouskem kždu se inspirovat tam. Jen musíte pamatovat, že takovýto kód je chráněn autorskými právy a nejde ho jen tak nahrát třeba zpátky do veřejného repozitáře MonoGame jako opravu. Autoři MonoGame si dávají velmi záležet na tom, že jejich kžd je opravdu čistý a originálně přepsaný od začátku.

Další zdroje o MonoGame

Pokud vás zajímá víc informací o MonoGame pro Windows 8, můžete se podívat na záznam mojí přednášky na MS Festu 2012. Popisuji tam, jak optimalizovat kžd pro různá DPI displejů, jak řešit snapped mžd Windows 8 nebo různé systémové dialogy.

Na této konferenci jsem měl i druhou přednášku nazvanou Tipy a triky pro vývoj her v XNA, tam jsem zase zaměřil na několik zajímavých technik, například jak urychlit vykreslování. V druhé části přednášky jsem popsal základní úvod do vývoje 3D her.

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

Kapitoly článku