speciál
Vývoj her v XNA #4: OOP a orientace v XNA

Vývoj her v XNA #4: OOP a orientace v XNA
Vývoj her v XNA #4: OOP a orientace v XNA
08:42, 11.01.2011

Postupně si v XNA společně naprogramujeme dvě hry. První bude již zmiňované chození po plošinkách ve 3D prostoru a sbírání objektů. Dalším naším cílem bude hra s raketkou, která prolétá nekonečným vesmírem, a naproti ní se objevují asteroidy. Hráč bude raketku ovládat a jednotlivé asteroidy sestřelovat.

Prozatím ale budeme spokojeni s tím, když si zkusíme nějakou texturu (obrázek) vykreslit na určité místo. Když si projekt zkompilujeme a spustíme přes klávesu F5 (nebo přes menu Debug > Start debugging, případně Ladit > Spustit ladění) uvidíme modré okno.

Není na něm nic, protože jsme zatím ani nic nechtěli vykreslit. Okno zavřeme, Visual Studio se automaticky přepne zpět do módu tvorby z módu ladění.

Klik pro zvětšení (Vývoj her v XNA #4: OOP a orientace v XNA)

V metodě Draw() si přitom všimněte zajímavého příkazu:

GraphicsDevice.Clear(Color.CornflowerBlue)

Tímto příkazem jednoduše překreslujeme okno hry. Děláme to tak, že zavoláme třídu GraphicsDevice a vykonáme její metodu Clear(). Do závorky zapíšeme nějaké dodatečné parametry. V tomto případě Color.CornflowerBlue.

Tento systém volání tříd a jejích metod a dále zadávání dodatečných parametrů je filosofie programování založení na objektovém modelu. Programovací jazyky, které pracují s objekty, třídami a metodami nazýváme objektově orientované. Zkratkou OOP.

Dnes jsou OOP jazyky vlastně standardem programování. Málokdo dnes vyvíjí například v jazyce C, který třídy a jejich metody neumí. Umí jen funkce, které nejsou přidružené žádné třídě či objektu. C++ jazyk je pak rozšířením jazyka C právě na podporu objektového modelu.

C# je OOP jazyk a celé programování ve Visual Studiu a .NET platformě je objektové. Vždy existuje určitá třída, zcela pro příklad třeba třída Obrazovka, a k ní jsou přidružené různé metody, které představují jednotlivé příkazy. Obrazovka by mohla například implementovat metody Překresli(). Jednotlivé metody pak mohou být ještě dodatečně ovládány parametry. Parametry můžeme cílový výsledek metody různě měnit. Naše metoda Překresli() by mohla přijímat parametr, který by říkal, jakou barvou bychom chtěli obrazovku překreslit. Výsledná podoba příkazu by mohla vypadat takto:

Obrazovka.Překresli(Červená)

Jak vidno, tato naše teoretická třída, metoda a k ní přidružené parametry jsou velice podobné těm, které jsme viděli o pár řádků výše.

GraphicsDevice.Clear(Color.CornflowerBlue)

Tyto jednotlivé třídy se časem budeme učit vytvářet, protože těmito třídami budeme efektivně v paměti uchovávat jednotlivé objekty na obrazovce. Asteroidy, střely a dokonce i hráčovu raketu.

Přejděme ale k prvnímu úkonu, který si můžeme sami zkusit. Můžeme změnit tu světlou modrou, kterou na obrazovce vidíme za nějakou jinou barvu. Například právě za červenou. Vymažte tedy z příkazu slovo CornflowerBlue a napište Red.

Pokud si zkusíme přes klávesu F5 projekt opět přeložit a spustit, uvidíme obrazovku červenou. Možná jste si všimli při psaní za tečkou zajímavé technologie Visual Studia. Nazývá Intellisense a je to jistý napovídač, který vám radí, co vše lze v daném místě v programu napsat. Například pokud bychom napsali „GraphicsDevice.“ tak by nám napověděl jaké metody třída GraphicsDevice podporuje, které můžeme v daném místě využít.

Je to skvělá věc, protože si člověk nemusí s ničím zbytečně lámat hlavu a hodně .NET developerů si na Intellisense zvyklo až do takové míry, že odmítají jiná vývojová prostředí, dokud nebudou Intellisense nabízet. Někdo to zas bere jako jistou pošetilost a spíše si vše pamatuje „poctivě“ nazpaměť.

Výsledkem by však měla zejména být „hra“ či spíše v tomto případě ještě okno, které vypadá nějak takto.

Klik pro zvětšení (Vývoj her v XNA #4: OOP a orientace v XNA)

Je to pro nás fenomenální úspěch, protože jsme konečně docílili toho, že program se chová tak, jak si to my představujeme.

Můžeme pokračovat tím, že si vykreslíme vlastní obrázek na okno. Budeme k tomu samozřejmě ten obrázek nejprve potřebovat.

Ke článku jsem vám přibalil tento balónek. Na hraní s vykreslováním nám plně postačí. Klikněte si na něj pravým tlačítkem myši a stáhněte si ho někam k sobě na počítač.

Klik pro zvětšení (Vývoj her v XNA #4: OOP a orientace v XNA)

Prvně si musíme tuto texturu nahrát do složky Content našeho projektu. Klepneme v Solution Explorer pravým tlačítkem na projekt Content, vybereme Add a klepneme na Existing Item. Najdeme v PC náš balónek a ten se nám nahraje do projektu. Případně si tento obrázek můžeme do složky Content přetáhnout z naší složky myší.

Klik pro zvětšení (Vývoj her v XNA #4: OOP a orientace v XNA)

Najdeme si v kódu řádek „GraphicsDeviceManager graphics;“ - je to začátek naší třídy Game1 a pod tento kód si nadeklarujeme vlastní proměnnou balonek třídy Texture2D.

Klik pro zvětšení (Vývoj her v XNA #4: OOP a orientace v XNA)

Přejdeme k metodě LoadContent() a do jejího těla si napíšeme instrukci, která do proměnné balonek nahraje náš obrázek balonek.png.

Napíšeme tedy



balonek = Content.Load<Texture2D>("balonek");

Všimněte si jedné zajímavosti. Jako argumenty metodě Load nepředáváme balonek.png, ale jen balonek. Je to z toho důvodu, že v projektu Content mají všechny objekty a předměty vlastní tzv. Asset Name. Ten se používá jako argumenty u metody Load(). Tento Asset Name si můžeme zobrazit v paletce Properties rozklepnutím vlastností u předmětu v Content. Jako je tomu u obrázku.

Klik pro zvětšení (Vývoj her v XNA #4: OOP a orientace v XNA)

Až budete dělat na hodně velkých projektech, dávejte si na Asset Name pozor ;).

Nyní máme obrázek v paměti a teď musíme už jen říct, kam jej chceme vykreslit. Musíme si na to otevřít nejdříve SpriteBatch. Do metody Draw() zapíšeme jednoduchý kód, kde SpriteBatch otevřeme, vykreslíme texturu na určitou pozici a pak SpriteBatch zavřeme.

spriteBatch.Begin();

spriteBatch.Draw(balonek, new Vector2(20,20), Color.White);

spriteBatch.End();

 



Klik pro zvětšení (Vývoj her v XNA #4: OOP a orientace v XNA)

Na prvním řádku SpriteBatch otevírám. Na druhém vykresluji texturu a nakonec SpriteBatch zavřu.

Všimněte si, že metoda Draw() u SpriteBatch má dohromady tři argumenty (parametry). Nejdříve píšu, jakou texturu chci vykreslit (v tomto případě texturu v proměnné balonek), pak říkám kde ji chci vykreslit (na pozici 20, 20), a nakonec barvu, jakou má být nasvětlena (barva bílá).

Co vás může mást je parametr Vector2(20, 20).



Orientace na obrazovce je totiž zajištěna pomocí tzv. kartézského souřadnicového systému. Pokud jste už dělali analytickou geometrii, nemělo by vám to činit potíže pochopit. Je to jednoduché. V levém horním rohu máme bod 0 a 0. Pokud půjdeme více dolů, budeme se nám plynule zvyšovat druhá složka. Pokud více doprava tak první složka. Pokud tedy chceme obrázek vykreslit na horní hraně ale více vpravo, tak řekneme, že jej chceme vykreslit na pozici 20,0.

Jednotlivá čísla představují obrazové body (pixely). Od leva doprava je osa X, od shora dolů osa Y. Na následujícím obrázku je to vidět.

Klik pro zvětšení (Vývoj her v XNA #4: OOP a orientace v XNA)

Plynulou změnou pozicí vykreslování docílíme časem pohybu textury.

Inu máme za sebou rychlé vykreslení vlastního obrázku. Můžeme slavit ;)

Příštích několik dílů se pustíme do 3D grafiky a naprogramujeme si společně slibovanou první hru.

Starší díly seriálu naleznete zde.

DALŠÍ

CGwillWin