speciál
Vývoj her v XNA #6: Jednoduchá 3D hra #1

Vývoj her v XNA #6: Jednoduchá 3D hra #1
Vývoj her v XNA #6: Jednoduchá 3D hra #1
09:19, 21.01.2011

V dnešním díle se už pustíme do vlastního programování jednoduché hry. Jak jsme si naplánovali minule, naším cílem bude chodit s hlavním hrdinou po plošinkách umístěných v prostoru a sbírat nějaké objekty. Cílem bude je všechny sesbírat za co nejkratší čas a přitom z plošinek nevypadnout. Pohled bude šikmo shora, kamera bude cestovat spolu s hlavním hrdinou.

Nastává nejlepší chvíle si vybrat konkrétní model našeho hlavního hrdiny. XNA Framework podporuje soubory ve formátu .x a .fbx. Mnoho modelů můžeme najít například na portálu TurboSquid, v těchto formátech je zde momentálně k dispozici cca 600 modelů zdarma. Můžete si některý vybrat a stáhnout. Například já jsem si zvolil tento model jakéhosi bacila. Pro stažení je potřeba se přihlásit, ale registrace je rychlá a je zdarma.

Klik pro zvětšení (Vývoj her v XNA #6: Jednoduchá 3D hra #1)

Pomocné komponenty

Abychom se pro začátek neutopili ve hromadě zdrojového kódu, připravil jsem tři soubory, které si můžete stáhnout:

Přílohu tří souborů zabalenou do .zipu stahujte zde.

Budete si je moci libovolně využít i ve svých projektech, obsahují cca 500 řádků kódu, který byste nejspíš tak jako tak museli sami psát. V začátcích vám ale pomohou se zorientovat s hlavními principy. Programování 3D grafiky bývá dost často hodně “ukecané”, pro vytvoření relativně základních věcí musíte napsat poměrně mnoho kódu. Při vytváření jakékoli větší hry se hodí znát principy objektového programování a nad celkovým návrhem docela přemýšlet.

Tyto soubory teď zevrubně popíšu, abyste věděli, co od nich můžete čekat. Můžete se už do nich podívat, později se k nim ale ještě podrobněji vrátíme. Pokusím se vysvětlit, jak přesně uvnitř fungují, případně navrhnu, čím by se dále daly vylepšit. Ještě větší zájemce případně odkážu na další literaturu.

ModelObject.cs – pomocný objekt, aby se nám pohodlněji pracovalo s modely. Ke každému modelu si pamatujeme jeho pozici ve světových souřadnicích, pootočení a měřítko (zmenšení nebo zvětšení). Všechny modely si můžeme uložit v jednom poli a vykreslovat voláním jedné metody. Dále zde máme automaticky spočítanou bounding sphere – nejmenší kouli, do kterého se vejde celý model (dá se využít například při ověřování jednoduchých kolizí mezi modely).

Camera.cs – jednoduchá herní komponenta starající se o nastavování matice pohledu (View Matrix) a projekční matice (Projection Matrix). Svoje parametry si automaticky nastavuje podle pozice a pootočení zadaného modelu. Tato kamera se potom předává dalším objektům, aby se podle ní mohly vykreslit na správné místo na obrazovce. Obdobný objekt by se dal udělat i pro jiné typy kamer (například pro takové, jako bývají v FPS střílečkách, nebo strategiích, leteckých simulátorech apod.).

RectanglePrimitive.cs – jednoduchý objekt obdélníku o zadané velikosti a pozici. Lze mu nastavit barvu, případně texturu a vykreslit ho na scénu. Slouží také jako ukázka, jak lze vygenerovat z kódu nějakou geometrii, pokud nemáme k dispozici model o zadaném tvaru. Podobně se mohou generovat i složitější objekty (například koule, válec, reálně vypadající terén nebo bludiště náhodného tvaru). Tyto obdélníky budeme skládat k sobě jako dlaždice, bude po nich chodit náš hrdina.

Založení nového projektu

Naši hru budeme programovat v XNA Frameworku verze 4.0, pro cílovou platformu počítače s Windows. Obdobně by se vytvářela hra pro Xbox nebo pro Windows Phone 7. Spustíme si Visual Studio a založíme nový projekt typu Windows Game (4.0), z kategorie XNA Game Studio 4.0. Připomínám, že pro správnou funkčnost je potřeba mít nainstalované Visual Studio 2010 (alespoň verze Express) a vývojové nástroje pro XNA 4.0. Dají se zdarma stáhnout například z oficiálních stránek App Hub.

Klik pro zvětšení (Vývoj her v XNA #6: Jednoduchá 3D hra #1)

Po založení projektu se nám objeví předpřipravený kód se základními metodami, jako LoadContent(), Update() a Draw(). S jejich základní funkčností bychom měli být obeznámeni z předchozích dílů seriálu. Nejdřív je dobré si odzkoušet, zda nám správně funguje kompilace a nemáme žádný problém např. s grafickou kartou. Neboli, jestli se nám spustí prázdná hra. Zkusíme stisknout Ctrl+F5, nebo zvolíme z horní nabídky Debug –> Start Without Debugging, mělo by se nám objevit prázdné modré okno. Pokud bylo vše v pořádku, můžeme okno zavřít a začít programovat. Jestli se to nepodařilo, ještě je možné si zkusit stáhnout jiný (novější) ovladač na grafickou kartu, případně odzkoušet spustit kompilaci na jiném počítači.

Nejdříve si zkopírujeme do projektu náš stažený model. Pokud byl zabalený v .zip archivu, rozbalíme si ho. Nejspíš se bude skládat z několika souborů, například bude mít k sobě přibalenou texturu. Zkontrolujeme, že alespoň jeden z nich má příponu .x nebo .fbx. Nyní všechny rozbalené soubory přetáhneme do panelu Solution Explorer, na položku označenou Content.

Dále si do projektu zkopírujeme tři pomocné soubory, které jsem zmiňoval na začátku, přetáhneme je k souboru Game1.cs. Situace by měla vypadat podobně, jako na přiloženém obrázku.

Klik pro zvětšení (Vývoj her v XNA #6: Jednoduchá 3D hra #1)

Nastavení jmenného prostoru

Nyní bude potřeba u těchto tří dohraných souborů změnit ve zdrojovém kódu jmenný prostor (namespace), aby se správně začlenily do našeho projektu. Najdeme si v naší hlavní třídě Game1, co máme napsáno na začátku kódu za slovem namespace. Nejspíš to bude velmi podobný název, jako se jmenuje náš projekt. Stejný text teď zadáme na obdobné místo i do souborů Camera.cs, ModelObject.cs a RectanglePrimitive.cs, místo původního namespace „XNA_hra“.

Náš projekt bychom tak měli mít připravený pro další použití. V příštím díle už pospojujeme díly skládanky do sebe a dostaneme první funkční verzi naší hry. Poté si popíšeme, jak jednotlivé části fungují a hru si ještě o něco vylepšíme.


CGwillWin