http://irrlicht.sourceforge.net/

Çeviri : Yunus Kara (www.darkscythe.net)

Örnek 6: 2D Grafikler

Bu örnekte irrlicht motoruyla 2d grafik kullanımını göreceğiz. Resim çizdirme, 'keycolor' tabanlı sprite çizdirme, transparan dikdörtgen çizdirme ve farklı yazı tiplerini ele alacağız. Eğer 2d bir oyun yapmak istiyorsanız yada güzel görünümlü bir arayüz tasarlamak istiyorsanız bu örnek faydalı olacaktır.

Burada açıklayacağımız program şuna benzeyecek:



Başlıyoruz!

Her zamanki gibi başlık dosyalarını ekleyip, ad uzayı kullanımını belirtiyoruz. Sonrada kütüphane dosyasını bağlıyoruz.

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

using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
               

En başta kullanıcıya sürücü tipini soruyoruz. Sonra Device'ı oluşturup pencere başlığını ayarlıyoruz. Son olarak 'VideoDriver' nesnesine bir gösterici tanımlıyoruz.

int main()
{
// let user select driver type
video::E_DRIVER_TYPE driverType;

printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char i;
std::cin >> i;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_SOFTWARE2;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 0;
}

// create device
  IrrlichtDevice *device = createDevice(driverType,
         core::dimension2d<s32>(512, 384));
  if (device == 0)
      return 1;
 
device->setWindowCaption(L"Irrlicht Engine - 2D Graphics Demo");
  video::IVideoDriver* driver = device->getVideoDriver();

Bu örnekteki tüm grafikler tek bir bitmap dosyasında bulunmaktadır(2ddemo.bmp). 'colorkey' tabanlı sprite lar çizdireceğimiz için , bu dokuyu yükleyip motora hangi kısımlarının görünmez olacağını belirtmemiz gerekiyor. Bu örnekte çizilmeyecek rengi direk belirtmiyoruz sadece motora (0,0) konumundaki rengi baz almasını söylüyoruz. Bunu kendimizde ayarlayabilirdik(driver->makeColorKeyTexture(images, video::SColor(0,0,0,0))). Burada dikkat edilecek olan şu ki 'makeColorKeyTexture' sadece renge göre bir 'alpha' kanalı oluşturacaktır.

video::ITexture* images = driver->getTexture("../../media/2ddemo.bmp");
driver->makeColorKeyTexture(images, core::position2d<s32>(0,0));

2 farklı yazı tipiyle yazı yazabilmek için yazı tiplerini yüklüyoruz. İlkini dahili font olarak ayarlayıp ikincisini dosyadan yüklüyoruz. Burada fazladan 2 dikdörtgen tanımlıyoruz(çizilecek 2 resmin yerini belirtmek için).

gui::IGUIFont* font = device->getGUIEnvironment()->getBuiltInFont();
gui::IGUIFont* font2 = device->getGUIEnvironment()->getFont( "../../media/fonthaettenschweiler.bmp");
core::rect<s32> imp1(349,15,385,78);
core::rect<s32> imp2(387,15,423,78);

Her şey hazır, şimdi sadece çizim döngüsünde herşeyi çizdireceğiz. Bu örnekte sadece 2d grafikler bulunmakta ama 2d,3d karıştırmak hiç sorun yaratmayacaktır. Bir 'scenemanager' oluşturarak 3d çizimler eklemeyide deneyebilirsiniz.

while(device->run() && driver)
{
if (device->isWindowActive())
{
u32 time = device->getTimer()->getTime();
driver->beginScene(true, true, video::SColor(0,120,102,136));

Önce 3 tane sprite çizdiriyoruz. Burada 'alpha' kanallarını ayarladığımız için siyah bölgeler çizilmeyecektir. Son parametre 'alpha' kanalı kullanımını onaylar. Son parametreden önceki, bir renk belirtir. Bu sprite'ın rengini ayarlar. Burada (255,255,255,255) vererek(beyaz) orjinal renginde çizdiriyoruz. 3. sprite'ın rengi zamana göre değişmekte.

// draw fire & dragons background world
driver->draw2DImage(images, core::position2d<s32>(50,50),
core::rect<s32>(0,0,342,224), 0,
video::SColor(255,255,255,255), true);
// draw flying imp
driver->draw2DImage(images, core::position2d<s32>(164,125),
  (time/500 % 2) ? imp1 : imp2, 0,
   video::SColor(255,255,255,255), true);
// draw second flying imp with colorcylce
driver->draw2DImage(images, core::position2d<s32>(270,105),
  (time/500 % 2) ? imp1 : imp2, 0,
  video::SColor(255,(time) % 255,255,255), true);

Yazı yazdırmak oldukça basit. Kodun kendisi açıklayıcı olacaktır.

// draw some text
if (font)
font->draw(L"This is some text.",
core::rect<s32>(130,10,300,50),
video::SColor(255,255,255,255));
// draw some other text
if (font2)
   font2->draw(L"This is some other text.",
       core::rect<s32>(130,20,300,60),
       video::SColor(255,time % 255,time % 255,255));

Son olarak, irrlicht logosunu çizdiriyoruz(renk ve alpha kullanımı yok). Fare imleci ile aynı pozisyonada yarı saydam bir kare çizdiriyoruz.

    // draw logo
driver->draw2DImage(images, core::position2d<s32>(10,10),
core::rect<s32>(354,87,442,118));
    // draw transparent rect under cursor
    core::position2d<s32> m = device->getCursorControl()->getPosition();
    driver->draw2DRectangle(video::SColor(100,255,255,255),
          core::rect<s32>(m.X-20, m.Y-20, m.X+20, m.Y+20));
    driver->endScene();
  }
}

Hepsi bu kadar.

   device->drop();
   return 0;
}