IRRLICHT - Hareket

IRRLICHT - Hareket

Bu dersimizde sizlere, önceden belirlenmiş dairesel hareketleri nasıl uygulayacağımızı göreceğiz. Örneğimiz bitince şuna benzeyecektir.


C/C++ kodu:

#include <irrlicht.h>
#include <iostream>

/*
  Herzamanki gibi Irrlicht başlık kütüphanesini ekliyoruz.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. "#pragma comment(lib, "Irrlicht.lib")" kodu ile kütüphane dosyamızı 
  bağlıyoruz. Derleyici programını önceden eklediyseniz yazmanıza gerek yok. Code::Blocks kullananlar kurulum 
  şeklini daha önceki derslerimizde anlatığımız gibi ugulaydıysanız, "#pragma comment(lib, "Irrlicht.lib")" 
  kodu kullanmanıza gerek yok.
*/
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")

/*
  IEventReceiver adında bir nesne oluşturuyoruz. Bu nesnemizde klavye girdileri işleyebilmek için kullanacaz. 
  Bu nesnede yineleme(override) yapılacak tek metod var oda "OnEvent". Bu metod motor tarafından herhangi bir 
  olay olduğunda çağırılacak ve olaya göre belirlediğimiz işlemler yapılacaktır. Bu örnekte W ve S tuşlarını 
  kullanarak modellerimizden birini aşağı-yukarı hareket ettireceğiz.
*/
class MyEventReceiver : public IEventReceiver

{
public:

    virtual bool OnEvent(const SEvent& event)
    {

        if (event.EventType == irr::EET_KEY_INPUT_EVENT)
            KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;

        return false;
    }
    virtual bool IsKeyDown(EKEY_CODE keyCode) const
    {
        return KeyIsDown[keyCode];
    }

    MyEventReceiver()
    {
        for (u32 i = 0; i < KEY_KEY_CODES_COUNT; ++i)
            KeyIsDown[i] = false;
    }

private:

    bool KeyIsDown[KEY_KEY_CODES_COUNT];
};

int main()
{
    //Daha önceki derslerimizde anlattığımız gibi grafik ayarlarını ve , SceneManager, Gui bu nesnelere birer pointer tanımlıyoruz. 
    MyEventReceiver receiver;
    IrrlichtDevice* device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480), 16, false, false, false, &receiver);

    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();

    /*
      Klavye ile hareket ettireceğimiz Node’u yaratıyoruz. Burada motor içinde dahili bulunan bir küp(TestNode) ekliyoruz. 
      Bu Node’u (0,0,30) konumuna yerleştirip daha düzgün gözükmesi için bir doku atıyoruz. 
    */
    scene::ISceneNode * node = smgr->addSphereSceneNode();
    if (node)
    {
        node->setPosition(core::vector3df(0, 0, 30));
        node->setMaterialTexture(0, driver->getTexture("media/wall.bmp"));
        node->setMaterialFlag(video::EMF_LIGHTING, false);
    }

    scene::ISceneNode* n = smgr->addCubeSceneNode();

    /*
      Şimdi bir “SceneNodeAnimator” tarafından hareket ettirilecek başka bir node yaratıyoruz. SceneNodeAnimator 
      nesneleri herhangi bir Node’a iliştirilebilinir(mesh,billboard,light,camera). SceneNodeAnimator nesneleri 
      bir nesnenin sadece pozisyonunu değil dokusunuda değiştirerek animasyon sağlayabilir. Yarattığımız yeni 
      nesneye bir dairesel hareket(’fly circle’) animatörü ekliyoruz. Dikkat edeceğiniz gibi dairesel hareketin merkezi, 
      klavye ile hareket ettireceğimiz nesne ile aynı ve hareketin çapıda 20 birim olarak verilmiş. Yani bu nesne klavye 
      ile hareket ettireceğimiz nesnenin çevresinde dönecek.
    */
    if (n)
    {
        n->setMaterialTexture(0, driver->getTexture("media / t351sml.jpg"));
        n->setMaterialFlag(video::EMF_LIGHTING, false);
        scene::ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(core::vector3df(0, 0, 30), 20.0f);
        if (anim)
        {
            n->addAnimator(anim);
            anim->drop();
        }
    }

    scene::IAnimatedMeshSceneNode* anms = smgr->addAnimatedMeshSceneNode(smgr->getMesh("media/sydney.md2"));

    if (anms)
    {
        //Modelimizi ileri doğru hareket ettirmesini sağlıyoruz.
        scene::ISceneNodeAnimator* anim =
            smgr->createFlyStraightAnimator(core::vector3df(100, 0, 60), core::vector3df(-100, 0, 60), 2500, true);
        if (anim)
        {
            anms->addAnimator(anim);
            anim->drop();
        }

        /*
          Modelimiz görünmesi için ışığı iptal ediyoruz, çünkü hiç ışık tanımlamadığımız için modelimiz siyah gözükecek. 
          Modelimizi 180 derece çeviriyoruz. Ve animasyon hızınıda belirliyoruz.Animasyonu elle ayarlamak yerine, 
          modelde dahili bulunan animasyonları anms->setMD2Animation(scene::EMAT_RUN) kodunu kullanarakta çağırabilirsiniz.
        */
        anms->setMaterialFlag(video::EMF_LIGHTING, false);

        anms->setFrameLoop(160, 183);
        anms->setAnimationSpeed(40);
        anms->setMD2Animation(scene::EMAT_RUN);

        anms->setRotation(core::vector3df(0, 180.0f, 0));
        anms->setMaterialTexture(0, driver->getTexture("media/sydney.bmp"));

    }

    /*
      Son olarakta projemizin köşesine bir irrlichtin logosunu ekliyoruz. Sizde Kendi oyunlarına logo 
      resimleri veya başka resimler eklemek isterseniz bu yöntemi kullanabilirsiniz. Resim 10.10 noktasından 
      çizdirilmeye başlıyor.
    */
    scene::ICameraSceneNode * cam = smgr->addCameraSceneNodeFPS(0, 100.0f, 100.0f);
    device->getCursorControl()->setVisible(false);

    Şimdi uzayımıza bir camera FPS kamerası ekleyip ve maus imlecini ortadan kaldırıyoruz.

    device->getGUIEnvironment()->addImage(
    driver->getTexture(”media / irrlichtlogoalpha2.tga”),
    core::position2d<s32>(10, 10));

    int lastFPS = -1;

    while (device->run())
    {
        /*
          Peneceremizin isim kısmına Fps (saniyede çizdirilen kare) sayısını ekliyoruz. W ve S tuslarıyla 
          modelimizi hareket ettirme kontrollerini ekliyoruz.
        */
        if (receiver.IsKeyDown(irr::KEY_KEY_W))
        {
            core::vector3df v = node->getPosition();
            v.Y += 0.02f;
            node->setPosition(v);
        }
        else if (receiver.IsKeyDown(irr::KEY_KEY_S))
        {
            core::vector3df v = node->getPosition();
            v.Y -= 0.02f;
            node->setPosition(v);
        }

        driver->beginScene(true, true, video::SColor(255, 113, 113, 133));

        smgr->drawAll();
        device->getGUIEnvironment()->drawAll();

        driver->endScene();

        int fps = driver->getFPS();

        if (lastFPS != fps)
        {
            core::stringw tmp(L"Hareket - Irrlicht Engine[");
                tmp += driver->getName();
            tmp += L"] fps: ";
                tmp += fps;

            device->setWindowCaption(tmp.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