Monogame je open source implementace XNA 4 frameworku z dílen Microsoftu. Cílem projektu je umožnit XNA vývojářům portovat své hry na mobilní platformy a Linux. Monogame je pouze framework, který znatelně ulehčuje vývojářům práci, poskytuje nástavbu OpenGL nebo DirectX a zjednodušuje export na platformy. Nejedná se engine, ten si musíte v určité formě napsat sami. Proto je vhodné mít hlubší znalosti objektově orientovaných programovacích jazyků. Na druhou stranu máte absolutní kontrolu nad svým projektem. Pro práci s Monogame potřebujete vývojové prostředí, jako třeba Visual Studio.

Nástroj: framework

Grafika: 2D/3D

Programovací/skriptovací jazyk: C#

Licence: Microsoft Public License

Na platformy: Windows, Mac, Linux

Exportovat lze na: Windows, Windows 8 Store, Mac, Linux, iOS, Android, Windows 8 Phone, PS 4

Web: http://www.monogame.net/

Dokumentace: http://www.monogame.net/documentation/

Fóra: http://community.monogame.net/

Další odkazy: https://github.com/mono/MonoGame

https://monogame.codeplex.com/

Přehlídka her: http://www.monogame.net/showcase/

Poznatky

Hned ze začátku je důležité zmínit, že Monogame není klasickým enginem, ale spíše naditou knihovnou tříd, které se vám budou při vývoji hodit. Zároveň získáte zjednodušené rozhraní pro vykreslování grafiky, takže se nemusíte učit DirectX ani OpenGL. A Monogame také ulehčuje portování hry na jiné platformy, kterých podporuje celkem velké množství. Je tu ale velké bohužel. Pokud chcete vyvíjet mobilní hry, musíte si každý měsíc platit vývojové prostředí Xamarin. Není to nic levného a pokud přestanete platit, ztrácíte možnost svůj projekt i updatovat. Mnoho vývojářů proto preferuje jednorázovou koupi Unity enginu (můj osobní tip by byl Godot).

Pokud chcete pracovat na počítačové hře, nemusí vás to zajímat. Stáhněte si z webu instalačku (berte tu aktuální pod nadpisem Development Builds) a zamiřte k Microsoftu pro Visual Studio (2010, 2012 nebo 2013). To obecně zadarmo není, ale je tu Visual Studio Express for Desktop (aktualizace – a teď i Community + Monogame je z něj možné přímo stáhnout jako Nuget balíček), které získáte bezplatně a pro vývoj s Monogame vám bude bohatě stačit. Po instalaci stačí spustit Visual Studio a měli byste nalézt nové šablony, které Monogame importoval. Vyberte si primární platformu a můžete se pustit do díla.

Frameworku bylo často vytýkáno, že nemá vyřešenou content pipeline. To je ta část kódu, která se stará o import herních assetů. Všechny převádí do společného formátu xnb, jehož výhodou je optimalizovaná struktura. Pokud například texturu načtete jako png, při nahrání se musí dál zpracovat, což může vyvolat v případě většího množství obrázků viditelné zpoždění. Xnb se načte o mnoho rychleji. Plán do budoucna je zrušit podporu nahrávání nekomprimovaných souborů, takže bych vám doporučil využívat content pipeline. Jak jsem již napsal, donedávna byla pořád nedokončená, takže jste si museli navíc nainstalovat staré XNA a vytvořit nový projekt Content, který jste se hrou propojili. Teď už se o nic takového nemusíte starat. Nová content pipeline je na svém místě, i když má ještě mouchy.

Vyberte si tedy jen platformu a vše by mělo být nastaveno. Prázdná šablona s herní smyčkou čeká na zaplnění. Začít 2D projekt je snadné. Stačí si vytvořit objekt třídy Texture2D a naplnit ho obrázkem, který nahrajete skrze objekt Content. Pro vykreslování textur už je v šabloně vytvořen velmi užitečný objekt SpriteBatch. Na první pohled je možná nejasné, jak se vlastně s prázdnou plochou pracuje. Jedná se o neohraničený trojrozměrný prostor (teoreticky je ohraničen počtem bitů číselných souřadnic), ale SpriteBatch vykresluje jen do dvou rozměrů. Horní levý roh obrazovky je počátek (0,0). Teoreticky můžete vykreslovat i za hranice obrazovky, i když tam neuvidíte. Jak ale posunout obraz?

Maticí. Nejen, že SpriteBatch dokáže sdružit několik spritů do jednoho draw callu (čímž se snižuje vytíženost CPU), ale jeho spouštěcí funkce přijímá také matici a efekt (shader). Obrazem tedy můžete posunovat, nebo ho zvětšovat či zmenšovat na základě vybraného rozlišení. Když budete zvětšovat celým číslem, docílíte toho, že váš pixel art bude vždy ostrý a nedeformovaný. Shaderem pak můžete docílit zajímavých grafických efektů i ve 2D hrách.

Když už jsem u shaderů, ty píšete do vlastních souborů s příponou fx a do hry je nahráváte skrze content pipeline do objektu třídy Effect. Z něj pak máte přístup ke všem technikám, průchodům a uniformním proměnným. Příjemné je, že shadery vždy píšete v jazyku HLSL. Pipeline se automaticky postará a konverzi do GLSL, když pracujete s OpenGL projektem. Lehkou nevýhodou je, že při psaní shaderů ve Visual Studiu Express nemáte k dispozici funkci IntelliSense, takže můžete v kódu nasekat spoustu triviálních chyb.

Pracovat ve 3D už tak snadné není, i když i zde je Monogame nápomocen. Můžete využít předpřipravený efekt Basic, který je automaticky modelu přiřazen při importu. Také je do něj vložena difůzní textura, pokud na ni model odkazuje. Do efektu následně musíte posílat transformační matice. Toto základní nasvětlení moc dobře nevypadá a díru do světa s ním neuděláte. Určitě budete potřebovat více druhů světel. A co třeba podpora normálových map? Nebo podpora většího množství dynamických světel? To vše si musíte napsat sami.

Když víte jak, není problém si napsat vlastní renderer odloženého stínování (deferred shading) nebo jeho variace (deferred lighting). K dispozici máte render target (textura, do které můžete vykreslovat obraz a dál ji použít ve vykreslovacím řetězci), takže není problém vytvořit GBuffer pro různé materiály a pro světla použít vhodnou geometrii (point light – koule, spot light – kužel, directional light – čtyřhran přes celou obrazovku), kterou pak vykreslíte do light mapy. Můžete se rozhodnout, jestli budete stínovat v prostoru světa (world space) nebo prostoru pohledu (view space). Můžete si vybrat, jestli ukládat hloubku lineárně či nelineárně. Implementace normálových map je samozřejmě také možná. Content pipeline při zpracování modelů umožňuje vytvořit tangenty (v době psaní profilu tato možnost existovala, ale ještě není funkční !). Spolu s normálou si ve vertex shaderu vypočítáte binormálu a sestavíte TBN matici, kterou budete násobit normály z textury (pokud jsou v tangent space).

V podstatě nejste ničím limitováni. Teď z hlavy si vzpomenu jen na to, že hloubkový buffer (Depth Buffer) je napevno svázán s render targetem, což trochu omezuje optimalizace při vykreslování light mapy. Dá se s tím ale žít. Problém je, že dobrých výsledků ve 3D dosáhnete jen tehdy, když si vše implementujete sami. Jak vidíte, není toho málo a to jsem se vůbec nedostal k různým metodám tvorby stínů. Pokud vás baví experimentovat a chcete výsledky vidět ihned, pak Monogame není pro vás. Já bych vám ale doporučil si takový jednoduchý renderer napsat. Možná to bude první a poslední, ale pak budete opravdu rozumět tomu, co všechno CPU a GPU dělá s modely, než se dostanou na obrazovku.

Brzy narazíte na problém, že při každé změně nějakého parametru musíte celý projekt zkompilovat. Nejvíc otravné to je, když se snažíte do scény umisťovat modely a světla. Chtě nechtě si musíte napsat nějaký editor scény, což je další práce navíc, co vás odtrhuje od tvorby hry samotné. Editor znamená potřebu tlačítek a text boxů – tedy GUI. Monogame ovšem žádný GUI systém nemá, takže si nějaký vytvoříte, nebo implementujete hotové řešení (což je snad ještě horší, protože všechny mají různé problémy, od špatné dokumentace po bugy). Najednou si potřebujete napsat spoustu nástrojů, což může snížit motivaci, pokud vás to nebaví.

Monogame je velmi povedený framework, ale jeho vývoj jde pomalým tempem. Content pipeline je konečně na místě, ale těžko říct, kdy bude fungovat generování tangent. Jelikož máte přístup ke zdrojovému kódu, můžete tuto funkčnost přidat. Tím se ale dostávám k tomu, proč tolik vývojářů přechází na Unity. Spoustu funkcí si musíte dopsat sami, což zdržuje od toho, co by vývojář asi dělal raději – samotnou hru. Monogame spíše ulehčuje komunikaci s periferiemi (kontrolovat stisky kláves nebo tlačítek gamepadu je opravdu snadné), grafickou kartou a stará se o import modelů, textur, shaderů a zvuků. Když pracujete ve 2D, není to takový problém, ale komplexnější projekt ve 3D si vyžádá vlastní framework nad Monogame.

Pokud rádi experimentujete a tvoříte hodně různých prototypů, pak potřebujete nástroj, který vám toho ulehčí víc. Na druhou stranu možná máte projekt, který chcete co nejlépe optimalizovat a víte, že se mu budete dlouho a naplno věnovat. Pak rozhodně uvítáte absolutní kontrolu, kterou vám tento framework dává. Může to znít divně, ale některé vývojáře prostě baví mnohem víc psát kód, než se vrtat v editoru. Chápu to. C# je pěkný jazyk a jakmile se do něj dostanete, blok (dobře okomentovaného) kódu vám toho rychle řekne víc, než různé grafické reprezentace. A ano, Monogame doporučím také těm, kteří se chtějí naučit programovat v něčem zajímavějším, než je suchá konzolová aplikace.

Výhody

– absolutní kontrola nad vaším projektem

– dobrý způsob, jak se naučit programovat v C#

– jednotné shadery v HLSL

– SpriteBatch zásadně ulehčuje tvorbu 2D hry

– povedená content pipeline (i když má ještě mouchy)

– podpora širokého spektra systémů, včetně PS 4

Nevýhody

– neulehčuje tvorbu GUI systému

– v určitých případech je nutné si napsat vlastní nástroje (jako editor scény)

– pro nováčky budou začátky s 3D docela náročné

– nevhodný pro prototypování a game jamy