Ogre Kütüphanesi Bölüm-10 Tanponlanmış Girdi-2
Geri Dön

Ogre Kütüphanesi Bölüm-10 Tanponlanmış Girdi-2

Anasayfa

B. PRATİK DERS


- Proje Adı: Ders5
- Header dosyası: Ders5.h
- CPP dosyası: Ders5.cpp

Adım adım yapılacak işlemler şu şekilde:

1. Her zaman olduğu gibi önce createScene fonksiyonumuzu hazırlayalım. AmbientLight’ımızı kuruyoruz, bir ninja E’si oluşturuyoruz, son olarak da bir ışık kaynağı oluşturuyoruz. Tüm bu işlemleri yapmak için aşağıdaki satırları createScene fonksiyonumuza ekleyelim:


void Ders5::createScene(void) {
// AmbientLight'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.25, 0.25, 0.25));
// Ninja Entity'mizi oluşturuyoruz:
Ogre::Entity* ninja = mSceneMgr->createEntity("Ninja", "ninja.mesh");
Ogre::SceneNode *ninjaDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("NinjaDugumu");
ninjaDugumu->attachObject(ninja);

// Bir ışık kaynağı oluşturuyoruz:
Ogre::Light* noktasalIsik = mSceneMgr->createLight("NoktasalIsik");
noktasalIsik->setType(Ogre::Light::LT_POINT);
noktasalIsik->setPosition(Ogre::Vector3(250, 150, 250));
noktasalIsik->setDiffuseColour(Ogre::ColourValue::White);
noktasalIsik->setSpecularColour(Ogre::ColourValue::White);
}


2. Şimdi oldukça farklı bir yöntem uygulayacağız. ninjaDugumu SN’si, mSceneMgr’nin SN’sine bağlı. Ders1’den hatırlayacağınız üzere sistem bu şekilde çalışıyor. Bu dersteki amacımız ninja’yı I-J-K-L tuşlarıyla hareket ettirmek değil. Bu derste kamera nesnesini hareket ettireceğiz ve döndüreceğiz. Ayrıca klavyeden 1 tuşuna bastığımız kameramız az sonra oluşturacağımız bir SN’ye bağlanacak. Bu şekilde konumu değişmiş olacak. Klavyeden 2 tuşuna bastığımızda da kameramızı başka bir SN’ye bağlayarak konumunu yeniden değiştireceğiz.

Peki, uygulayacağımız asıl ilginç yöntem nedir? Normalde SN oluştururken bir nesne ismi belirliyorduk ve bir de createChildSceneNode fonksiyonunun ilk parametresinde string türünde bir isim daha belirliyorduk. İkisini kullanarak da get fonksiyonlarıyla SN’ye ulaşabiliyorduk.

Kameranın konumunu ayarlayacak iki SN’yi belirlerken nesne ismi oluşturmayacak, sadece parametredeki string türündeki ismini yazacağız. Daha bitmedi. Bu işlemi yapmak için ninjaDugumu’nün bağlı olduğu SN’ye ulaşıp ona çocuk(child) SN oluşturacağız. Örneğin kamera için kullanacağımız ilk SN’yi oluşturalım. createScene fonksiyonunun en altına şu satırları ekleyin:


// Birinci Kamera SceneNode'sini oluşturuyoruz:
ninjaDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("KameraDugumu1", Ogre::Vector3(-400, 200, 400));


Şimdi biz ne yaptık? Parametre ismi KameraDugumu1 olan bir SN oluşturduk. Bu SN’yi ninjaDugumu’ne atadık. Hatırlayalım, eşitliğin sağ tarafındaki değer; eşitliğin sol tarafındaki değişkene atanıyordu. Bu durum nesneler içinde aynı. Son yazdığımız bu iki satırdan itibaren ninjaDugumu nesnesine yaptığımız her işlemi aslında KameraDugumu1’e yapmış olacağız. Peki, yaptığımız işlemlerden ninja nesnesi etkilenecek mi? Hayır! Çünkü onu, bu iki satırdan önceki satırlarda belirledik. Ona etki eden değerler değişmez. Ne zamanki “ninjaDugumu = mSceneMgr->getSceneNode("NinjaDugumu");” yazarız, o zaman yaptığımız değişikler ninja nesnesini etkilemeye başlar. Hatırlayalım, kodlarımız C++ tarafından her zaman ilk satırdan son satıra doğru sırayla okunuyordu.

3. Şimdi KameraDugumu1 SN’sine atadığımız vektörü sağa doğru 45 derece çeviriyoruz. Tabii bu işlemi ninjaDugumu üzerinden gerçekleştiriyoruz. Ne de olsa artık KameraDugumu1’i kontrol ediyor. Şimdi createScene fonksiyonuna şu satırları ekleyelim:


// KameraDugumu1'i 45 derece Ninja'ya doğru çeviriyoruz:
ninjaDugumu->yaw(Ogre::Degree(-45));


4. Şimdi kameramızı KameraDugumu1 SN’sine bağlıyoruz. Artık kameramızın konumu, yönü vb. bu SN’nin değerlerine göre ayarlanacak:


// Kamera nesnemmizi KameraDugmu1'e bağlıyoruz:
ninjaDugumu->attachObject(mCamera);


5. Klavye’den iki tuşuna basıldığında kameranın konumunun ve yönünün değişeceğini söylemiştik. Bu konum ve yönü değiştiren işlem ise kamera nesnesinin başka bir SN’ye bağlanması olacaktı. Şimdi de kameramız için bu ikinci SN’yi oluşturuyoruz. Tıpkı KameraDugumu1’i oluştururken yaptığımız işlemlerdeki gibi bunu yapıyoruz. createScene fonksiyonumuza şu satırları ekleyelim:


// İkinci Kamera SceneNode'sini oluşturuyoruz:
ninjaDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("KameraDugumu2", Ogre::Vector3(0, 200, 400));


6. Şimdi createFrameListener fonksiyonumuzla ilgilenelim. createFrameListener fonksiyonu ne işe yarar? FrameListener döngüsü için kullanılacak olan kodları hazırlar. Örneğin uygulama çalışınca bir nesnenin her kare’de X değerinin 5 artmasını söyledik. Ama nesneye herhangi bir konumlandırma vektörü atamadık. Ya da sıfır vektörüne de eşitlemedik. FrameListener bu nesnenin konumunu arttırmaya kalktığında artırılacak bir değer bulamaz.

Sonuç olarak bizim her zaman bir tür varsayılan değer, nesne vb. şeyler atamamız gerekir. createFrameListener fonksiyonunu da FrameListener döngüsü için varsayılan değerlerin atandığı fonksiyon olarak düşünebiliriz. Bu işlem Amerikan İngilizcesi’nde initialise, Britanya İngilizcesi’nde: initialize adını alır. Bu kelimelerin anlamı “başlangıç durumuna getirmek”tir.

Öncelikle BaseApplication’da tanımlanmış olan createFrameListener fonksiyonunu, kendi createFrameListener fonksiyonumuzda da çağırıyoruz. Yani Ders5.cpp dosyasındaki createFrameListener fonksiyonunda, BaseApplication.cpp dosyasındaki createFrameListener fonksiyonunu çağırıyoruz. Çünkü gerekli düzenlemeleri içinde barındırıyor. Örneğin, OIS kütüphanesini KeyListener ve MouseListener sınıflarının, FrameListener döngüsüne kaydedilmesi işlemi gibi. createFrameListener fonksiyonumuzu düzenliyoruz:


void Ders5::createFrameListener(void) {
// Gerekli olan diğer düzenlemeler için createFrameListener fonksiyonunu çağırıyoruz:
BaseApplication::createFrameListener(); }


7. Ders5.h dosyasında Real türünde iki değişken ve ayrıca bir vektör nesnesi ve SN nesnesi tanımlamıştık. Şimdi tüm bunların ayarlamalarını yapacağız. Diğer bir tabirle initialise işlemini yapacağız. Öncelikle gecerliKameraDugumu nesnemize, kameramızın bağlı olduğu SN’yi atayacağız. createScene fonksiyonunda kameramızı KameraDugumu1 SN’sine bağlamıştık. Bu durumda; gecerliKameraDugumu SN’sine, KameraDugumu1 SN’si atanmış olacak. createFrameListener fonksiyonumuza şu satırları ekleyelim:


// gecerliKameraDugumu'ne, createScene fonksiyonumuzda kameramızı bağladığımız SN'yi atıyoruz:
gecerliKameraDugumu = mCamera->getParentSceneNode();


8. Şimdi döndürme ve hareket katsayılarını belirleyelim. Atayacağımız değerleri, resmi eğitim dokümanından aldık. Siz isteğinize göre bu değerleri değiştirebilirsiniz. createFrameListener fonksiyonumuza şu satırları ekleyelim:


// Döndürme ve Hareket katsayılarını belirliyoruz:
dondurmeKatsayisi = 0.13; hareketKatsayisi = 250;


9. createFrameListener fonksiyonumuzdaki son işlem olarak da otelemeVektoru’nü sıfır vektörüne eşitliyoruz. Sıfır vektörünün static olduğunu önceki derste söylemiştik. Şimdi createFrameListener fonksiyonumuza şu satırları ekleyelim:


// otelemeVektoru'müzü sıfır vektörüne eşitiliyoruz:
otelemeVektoru = Ogre::Vector3::ZERO;



Anasayfa

Tüm Hakları Saklıdır. ©Arleone 2013-UstaDerslik