Po tom co vše nastavíme bude compiler vědět kde jsou hlavičkové soubory enginu. Přidáme je následujícím kodem.
V irrlich enginu, se všude vyskytuje slovo 'irr'. Tedy když budete chtít použít třídu enginu,tak napíšete 'irr' před jménem třídy. Například pro použití IrrlichtDevice, napíšete: irr::IrrlichtDevice. Aby jste se vyhnuli psaní irr:: před každou třídou, řekneme to compileru tímto příkazem.
Následuje 5 sub-namespaců. Pokud chcete detailní výpis/popis namespaců navštivte oficiální stránky
'Namespace list
'(Bohužel v angličtině). Aby tento první tutoriál zůstal méně obtížným, nebudeme přesněji specifikovat funkci těchto řádků, a proto:
using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; |
Abychom mohli používat irrlich DLL (knihovnu) potřebujeme odkaz na Irrlicht.lib. Pro přidání odkazu použijeme příkaz pragma comment:
#pragma comment(lib, "Irrlicht.lib") |
Tak, teď jdeme na to hlavní. Celý chod programu se víceméně nachází mezi složenými závorkami funkce main().
Nejvíce důležitá funkce v enginu je 'createDevice'. S její pomocí není třeba tvořit složitou třídu okna, zda běží ve fullscreenu atd. Některé parametry jsou nepovinné, ale je lepší je uvést.
createDevice() má 7 parametrů:
-
deviceType: typ zařízení. Možnosti, kterými bude grafika zobrazena jsou tyto: softwarové zařízení, Direct3D8, Direct3D9, nebo OpenGL. V tomto případě použijeme EDT_SOFTWARE (softwarové zařízení), ale pokud chcete použít jiný, stačí EDT_SOFTWARE nahradit EDT_DIRECT3D8, EDT_DIRECT3D9, nebo EDT_OPENGL.
-
windowSize: Velikost okna. V našem případě použijeme velikost 512x384.
-
bits:Počet bitů na jeden pixel. Běžně 16 nebo 32.
-
fullscreen: Zadáváme zda chceme aby aplikace běžela ve fullscreenu či nikoliv. Možnosti jsou true - ano, false - ne.
-
stencilbuffer: Zadáváme zda chceme použít stencil buffer pro vykreslení stínů.
-
vsync: Určuje zda chcete použít vsnyc (nyní dále nespecifikováno). Pouze pokud jste použili fullscreen true.
-
eventReceiver: V našem příkladu tento parametr nevyužijeme, a nastavíme jej tedy na 0.
IrrlichtDevice *device = createDevice(EDT_SOFTWARE, dimension2d<s32>(512, 384), 16, false, false, false, 0); |
Tak a ted nastavíme jako nadpis okna nějaký pěkný text. Kod začíná písmenem L. Za ním již následuje nadpis okna uzavřený v uvozovkách. Jak je již z kodu patrné, nadpis bude hello World! - Irrlicht engine Demo.
device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo"); |
Nastavení ukazatelů na video driver, scene manažer a konečně i GUI - graphical user interface (má na svědomí vykreslování všech textů, tlačítek, kurzorů a dalších).
IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment(); |
Vepíšeme do okna text použitím GUI prostředí. Text má pozici (10,10) levý horního roh a (200,22) pravý dolní roh.
guienv->addStaticText(L"Hello World! This is the Irrlicht Software engine!", rect<int>(10,10,200,22), true); |
Pro zobrazení něčeho zajímavého, nahrajeme a vykreslíme model z quaka 2. Aby jsme mohli s modelem pracovat musíme ho nejdříve nahrát. Provedeme to pomocí getMesh(). Pro zobrazení modelu použijeme addAnimatedMeshSceneNode(). Protože se jedná o animovaný model, obsahuje volání funkce slovo animated, kdyby jste si přáli nahrát statický model, stačí funkci zaměnit za addMeshSceneNode(). Místo nahrávání Quake2 modelů (.md2), můžeme použít také Maya object (.obj), kompletní Quake 3 mapu(.bsp), nebo soubor Milshape (.ms3d) .
poznámka: když překládám tento článek existuje už i beta verze 1.4 která podporuje ještě mnoho dalších typů. Pro kompletní výpis navštivte sekci Vlastnosti.
Nahrávaný model se jmenuje sydney.md2 a byl vymodelován Brian Collinsem.
IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2"); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); |
Aby jsme udělali model více hezčí, změníme jeho materiál. Vypneme světlo protože nemáme žádné vytvořeno a tudíž by byl model celý černý. Dále vytvoříme smyčku která zajistí že se model bude animovat pořád dokola od snímku 0 až 310. Jako poslední aplikujeme texturu na model.
if (node) { node->setMaterialFlag(EMF_LIGHTING, false); node->setFrameLoop(0, 310); node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") ); }
|
Abychom viděli model, musíme nastavit pozici kamery směrem na model (0, 10, -40). Kamera je natočena od její pozice směrem k (0,5,0). První vector3df tedy určuje samotnou pozici kamery a druhý vector pak její natočení.
smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); |
Ok.Nyní máme nastavenou scénu, jdeme tedy na samotné vykreslení: přidáme podmínku while() která zjistí zda jsme již vytvořili device(createDevie()) a dále spustí následující blok příkazů.
Všechno musí být vykresleno mezi beginScene() a endScene(). Scéna začne, dále se vše vykreslí a scéna se ukončí (scénu je třeba ukončit pokaždé kvůli paměti. kdyby jste tuto funkci vynechali, náš program by se po určité době zastavil právě z nedostatku paměti). Parametr Scolor() určuje barvu pozadí. Čím větší číslo tím světlejší a naopak (255-bílá, 0-černá).
driver->beginScene(true, true, SColor(255,100,101,140));
smgr->drawAll();
guienv->drawAll(); driver->endScene();
} |
Pokud neproběhne první podmínka v programu (createDevice) správně, program se ukončí.
device->drop(); return 0;
} |
Zkompilujte a spust'te