Martin Vodák

Vývojářský blog - Martin Vodák



Podle kategorie

MonoGame první nahlédnutí

Martin Vodák       31. 1. 2015       C#, XNA, Grafika, .NET       4502 zobrazení

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 logo

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.

NuGet manager

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í.

Změna nastavení projektu

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.

Herní smyčka

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.

Přidání obrázku

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.

První aplikace

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.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

Časová náročnost

Ahoj, pěkný a srozumitelný úvod. Měl bych možná námět na jeden díl (možná díl nula nebo jen tak mimo). Vždy když se mluví o frameworcích a toolech na vývoj her, každý se hned ptá (a já vlastně také), jak je takový nástroj mocný, co se v něm dá vytvořit a kolik to dá úsilí. Zajímalo by mě, jak je to například s grafikou, zda je to spíše práce pro grafika nebo si zvládne nějakou pěknou grafiku pro hry udělat i vývojář odkojený na běžných aplikacích :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

MonoGame je tak nějak v prostřed spíš blíž tomu nízkoúrovňovýmu, je to stejné jak XNA vše si musíš zařídit sám ale právě díky XNA je na webu spousta dobrých článků a dodatečných knihoven.

Grafiku můžeš importovat v podobě obrázků a modelů (fungují formáty .x a .fbx), ale všeobecně platí že pokaď chceš aby hra nějak vypadala, tak grafika určitě potřebuješ (já teda určitě :-D)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pěkné

Pěkné. Jen pokud těch dílů bude opravdu víc, tak by to chtělo na konci každého článku odkaz ke stažení hotového projektu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

jasně, to je dobrá připomínka, doplníme :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback