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.  

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

Bu blogdaki popüler yayınlar

SDL Nedir?

Doxygen Kullanımı

OpenGL'de Line (çizgi) Çizdirme