Ahoj poprvé. V následující sérii článků se pokusím poskytnout čtenářstvu něco málo o frameworku MonoGame a také o práci s 3D grafikou. A cože to to MonoGame je? To se pokusím vysvětlit právě v tomto článku.
MonoGame je framework určený pro tvorbu her. Když už se rozhodnete, že vytvoříte hru, tak máte v zásadě několik možností co provést:
- napsat si kompletně vše sami (to potom určitě tyto články potřebovat nebudete),
- použít čisté DirectX a nebo OpenGL,
- použít herní framework (Slick pro javu kupříkladu, MonoGame pro C#),
- použít Unity,použít komerční velký a také často drahý engine (Cry Engine, UDK...).
Volby jsem naschvál seřadil podle náročnosti, která je zde kladená na programátora jako takového. MonoGame se tak nachází někde ve středu. Nemusíte ovládat grafické API, protože o to se MonoGame stará samo, ale pouze je krmíte daty. Na druhou stranu to není tak snadné jako v Unity, které se postará o většinu grafických efektů o management scény a tak dále. Je to prostě vprostřed.
MonoGame nám tedy neposkytuje kompletní servis, ale zapouzdřuje nízko úrovňová volání, takže je snadno pochopitelný pro začátečníky. Navíc kdo znal XNA, tak zde bude jako ryba ve vodě. MonoGame je vlastně jen open source implementací tohoto API. A jde vlastně ještě dál, než kam se XNA odvážilo. Přidává totiž i podporu dalších platforem jmenovitě kupříkladu Android, iOS a nebo taky Linux. Hru lze tak s drobnými obměnami snadno přenášet mezi různými platformami. Což je v dnešním světe dost potřebná vlastnost. Dobré je ale taky upozornit, že projekt je stále ve vývoji a že u některých převážně pokročilejších funkcí můžeme narazit na oblíbenou NotImplementedException. Ale tato místa pomalu ale jistě mizí.
Hry, které využívají MonoGame
K práci v MonoGame budeme potřebovat Visual Studio 2013 (a nebo jinou vaši oblíbenou verzi i taková C# express edice by měla stačit, v pohodě mi běželo MonoGame i ve verzi 2010) a to je vlastně všecko.
Instalace
Před použitím budeme potřebovat buď MonoGame nainstalovat z připraveného instalátoru, který je k nalezení na webu projektu (http://www.monogame.net/downloads/) a nebo můžeme použít hotového NuGet balíčku (toho využijeme v tomto návodu). Ale konec řečí pojďme na to.
První “hra”
Ve Visual Studiu si založíme prázdný projekt. V záložce References pak vybereme Manage NuGet Packages a dostaneme se do dialogového okna, kde si vyhledáme balíček MonoGame a nainstalujeme si jej.
Přímo po instalaci se nám připraví projekt s jednoduchou hrou. Pokud jej nyní zkusíte spustit, tak by se mělo objevit okno s modrou obrazovkou a taky bohužel okno s konzolí. Modré okno chceme to je místo, kde budeme dělat naše grafické zázraky, ale konzoli už tolik ne. Naštěstí se jí dá snadno zbavit, v nastavení projektu si pod záložkou Application změníme u položky Output type z Console Application na Windows Application a konzole nám zmizí.
Pojďme se ale podívat přímo do zdrojového kódu, ten nám o samotné aplikaci prozradí více. V projektu máme celkem dva různé zdrojové soubory Program.cs a Game1.cs. To zajímavé se nachází v Game1.cs, tak se na něj pojďme podívat detailně. Právě v této třídě budeme mít celou logiku naší hry. Popravdě to ze začátku bude hře velmi vzdálené, ale třeba se to časem vyvrbí. Máme zde několik přepsaných metod, pojďme se na ně podívat.
První je metoda Initialize, tato metoda se nám zavolá jednou a to pouze při startu celé aplikace. Sem budeme umisťovat jak už jméno jasně říká inicializační věci. Metoda LoadContent se volá taktéž jen jednou a také po startu aplikace, ale až po metodě Initialize. Rozdíl mezi těmito metodami je ten, že v tento okamžik už máme vše připraveno pro načítání součástí hry (textury, zvuky, modely...) a veškeré načítání budeme umisťovat sem. Metoda Update je narozdíl od předchozích metod volána až do konce hry. V této metodě budeme měnit stav objektů ve hře, třeba řídit animaci. Předposlední metodou je metoda Draw, právě zde budeme realizovat vykreslování. Obě tyto metody se volají v nekonečném cyklu po celou dobu běhu programu. Poslední metoda UnloadContent pak slouží k vyhození načteného obsahu a zavolá se jednou, při vypínání hry.
Ale aby nebyl tento článek jen teoretickým úvodem pojďme si na modré pozadí (těm co znají staré XNA, tak tuto barvu znají moc dobře, je to ona slavná corn flower blue) také něco vykreslit. Nebudeme začínat hned nějakým složitým modelem, ale ukážeme si vykreslení takzvaného sprite. Sprite je vlastně jen obrázek. V MonoGame na to máme stejně jako v XNA k dispozici třídu SpriteBatch. Tato třída nám vše zařídí a ani nemusíme mít žádné tušení jak to uvnitř funguje. My ale chceme jít trošku více do hloubky a tak si to v dalších dílech osvětlíme. V šabloně projektu již máme jednu instanci připravenou, takže ji jen v metodě Draw požijeme. Nejdřív, ale musíme mít co vykreslovat. A k tomu potřebujeme do projektu přidat obrázek. Proto si v projektu vytvoříme složku Content a do ní jej nahrajeme. V nastavení nesmíme zapomenout změnit hodnotu u parametru Copy to Output Directory na Copy if newer, aby se nám při případné změně sám nakopíroval.
Toto je jen jeden ze způsobů jak lze v MonoGame nahrávat obrázek o dalších možnostech si povíme něco v nějakém dalším dílu. Pojďme se podívat do kódu. Přidáme si proměnnou, kde budeme mít uloženou texturu:
Texture2D texture;
A v metodě LoadContent ji jak jsme si řekli výše nahrajeme:
texture = Content.Load<Texture2D>("logo");
Všimněte si prosím, že název souboru je zde BEZ přípony a také bez složky Content. Toto si prosím zapamatujme, stejná pravidla pak platí i pro nahrávání modelů a dalších součástí hry. Metoda je generická a proto se pro jednotlivé typy herního obsahu bude tento parametr lišit. Máme tedy nahranou texturu a teď ji už jen chceme vykreslit. Vykreslení tedy dáme do metody Draw. Vypadá to následovně:
Begin();
Draw(texture,new Vector2(100,100),Color.White);
End();
Zavoláním metody Begin si incializujeme sprite batch a je tak připravena pro vykreslování. Na následujícím řádku, pak dáváme jakýsi záznam toho, co se má vykreslit. Konkrétně vykreslujeme naši texturu na pozici (100,100). Nulu pak máme v horním levém rohu. Poslední řádek pak provede vykreslení ač tomu název metody vůbec nenapovídá, je to tak. Sprite batch se totiž snaží o optimalizaci vykreslování a proto se o vykreslení postará až když má vše co vykreslovat má. Ale o tom, co vykreslování ovlivňuje a zpomaluje si povíme zase někdy příště. Nyní, když projekt spustíme měli bysme mít modrou plochu a na ní náš obrázek.
A to bude pro dnešek všechno. Celý projekt si můžete stáhnout tady:
Příště se podíváme trochu pod kapotu a zjistíme jak to všechno funguje.