IRRLICHT - Quake3Map
IRRLICHT - Quake3Map
Bu dersimizde sizlere Quake3 haritasını nasıl yükelyeceğimizi ve
kullanıcı kontrollü bir FPS camera nasıl ekliyeceğimizi öğretecez.
Ayrıca maus işareticiğini kaldıracağız.
Örneğimiz asağıdaki resim gibi olacak.
Örneğimiz asağıdaki resim gibi olacak.
C/C++ kodu:
//Irrlicht başlık dosyasını ekliyoruz. #include <irrlicht.h> /* Using namespace ifadesi yazamamızın nedeni, herdefasında "::" Kapsam çözünürlük Operatörü kullanmamızı ortadan kaldırır, böylece zaman kazanmış oluruz ve karmaşıklık yaratmış olmaz. */ using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; int main() { /* OpenGL ile çalışan device oluşturuyoruz. Ve projemiz FULLSCREEN olarak çalışacaktır. true, false, false, 0); bunun için true aktif yapmanız gerekiyor. */ IrrlichtDevice *device = createDevice(video::EDT_OPENGL, dimension2d<s32>(1024, 768), 32, true, false, false, 0); //Bunlar Device sınıfının nesneleridir.VideoDirver, SceneManager ve Gui nesnelerine birer pointer tanımlıyoruz. video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment(); //projemize bir logo ekliyoruz. guienv->addImage(driver->getTexture("ceida.JPG"), core::position2d<s32>(10, 10)); /* Quake 3 haritasını yüklüyoruz. Quake3 haritaları sıkıştırılmış bir dosya biçimine benzer. .pk3 uzantısı şeklinde olurlar. Haritayı yüklememiz için FileSystem() fonksyionunu kullanıyoruz. Dosayayı ekledikten sonra verileri okuyabiliriz. Quake 3 haritalarını kendi editör programı ilede yapabilirsiniz. */ device->getFileSystem()->addZipFileArchive("map - 20kdm2.pk3"); /* Şimdi haritayı getMesh() fonksiyonu ile okuyabilirsiniz.Bu metod bize bir IAnimatedMesh göstericisi döndürecektir. Bildiğiniz gibi Quake 3 haritaları animasyonlu değildir, onlar sabit geometri bilgileri ve materyal bilgileri içerirler. Bu yüzden IAnimated mesh sadece tek kareden oluşur ve bizde 1. kareyi alırız ki oda q3 haritamızdır. “addOctTreeSceneNode()” metodunu kullanarak bu mesh den bir OctTreeSceneNode oluşturuyoruz. OctTree haritayı biraz optimize edecek, sadece görülebilir yerlerin çizilmesini sağlayacaktır. OctTree ye alternatif olarak “AnimatedMeshSceneNode” kullanabilirsiniz ama o zaman tüm harita çizilecektir. “addOctTreeSceneNode” yerine “addAnimatedMeshSceneNode” yazıp çizilen poligon sayısını karşılaştırabilirsiniz. (IVideoDriver sınıfında çizilen poligon sayısını gösteren “getPrimitiveCountDrawed()” adlı bir metod vardır). Unutmayınki Octree sadece büyük ve çok sayıda geometri bilgisi içeren meshler ile kullanılınca yararlıdır. */ scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp"); scene::ISceneNode* node = 0; if (mesh) node = smgr->addOctTreeSceneNode(mesh->getMesh(0), 0, -1, 128); if (node) //Haritanın yerini belirtiyoruz. node->setPosition(core::vector3df(-1300, -144, -1249)); /* Projemize bir camera ekliyoruz. Irrlicht motorunda birkaç çeşit kamera tipi mevcut.Mesela iki tuşada basınca zoom yapabilen vb. Maya kamerası. Böyle bir kamerayı “addCameraSceneNodeMaya()” metodu ile oluşturabiliriz. Fakat bu örneğimizde bize bir FPS kamerası lazım.”addCameraSceneNodeFPS()” metodu işimizi görüyor. device->getCursorControl()->setVisible(false); bu fonksiyon ile fare işaretciğini kaldırıyoruz. */ smgr->addCameraSceneNodeFPS(); device->getCursorControl()->setVisible(false); int lastFPS = -1; /* Saniyede alınan kare sayısınıda pencerenin başlığına yazdırcağız. “if (device->isWindowActive())” satırı seçime bağlı ama başka bir program aktif iken, görev değişiminden sonra motorun fare imlecinin yerini değiştirmesini engeller. Bukadar basit. Bu projemiz üzerinde bazı değişikler yapabilirsiniz. Mesala bir logo resmini değiştirin camera posizyonu ile oynayın… Böylece daha çabuk kavramış olursunuz. */ while (device->run()) if (device->isWindowActive()) { driver->beginScene(true, true, 0); smgr->drawAll(); guienv->drawAll(); driver->endScene(); int fps = driver->getFPS(); if (lastFPS != fps) { core::stringw str = L"Per pixel lighting example - Irrlicht Engine["; str += driver->getName(); str += "] FPS:"; str += fps; device->setWindowCaption(str.c_str()); lastFPS = fps; } } device->drop(); return 0; }Samed Ceylan
Yorumlar
Yorum Gönder