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
Yorum Gönder