IRRLICHT - Kullanıcı Arayüzü

IRRLICHT - Kullanıcı Arayüzü

Bu dersimizde irrlicht kullanıcı arayüzlerini göreceğiz. Buton, Pencere, Kaydırma Çubuğu ve Liste Kutuları kullanımını öğreceğiz. Bu uygulamayı irrlicht\bin\Win32-VisualStudio\05.UserInterface.exe dosyası üzerinden çalıştırabilirsiniz. Aynı zamanda kaynak koduna irrlicht\examples\05.UserInterface klasöründen ulaşabilirsiniz. 

Uygulamamızın örnek resmi şu şekilde: 



 

C/C++ kodu:
#include <irrlicht.h>
#include <iostream>

using namespace irr;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;


/*
  Başlık dosyalarımızı include ediyoruz.Sonraa kütphane dosyamızı link ediyoruz.Daha önceden bunu 
  tanıttı iseniz kullanmanıza gerek yoktur. "IrrlichtDevice *device = 0;" Bu kod ile Device nesnemize 
  bir değiken atıyoruz.Daha sonra cnt adında bir sayaç değişkeni ve listbox için bir değişken ekliyoruz.
*/
#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#endif
IrrlichtDevice *device = 0;
s32 cnt = 0;
IGUIListBox* listbox = 0;

/*
  Bir sınıf oluşturuyoruz. Kullanıcı arayüzlerinin tüm sağladığı ( Buton tıklama ve listeden bir elman seçme…) 
  birimleri işleyebilir. Bu sınıfta tıklanan butonların id numarasını alıyor ve ne yapmaları gerektiği konusunda 
  işlev yapıyor. Irrlicht motorunda s32,u32,f32 vb. değişken tipleri ile karşılaşabilirsiniz. s32 ’signed integer’ 
  anlamında 32 bitlik bir int’dir. f32′yi 32 bitlik bir float.
*/
class MyEventReceiver : public IEventReceiver
{
public:
    virtual bool OnEvent(const SEvent& event)
    {
        if (event.EventType == EET_GUI_EVENT)
        {
            s32 id = event.GUIEvent.Caller->getID();
            IGUIEnvironment* env = device->getGUIEnvironment();

            switch (event.GUIEvent.EventType)
            {
                /*Burada kaydırma çubuğunun id numarasını alıp (104) , pozisyona göre tüm arayüz elemanlarının 
                görünüş deriniğini değiştiriyor. Tüm renk ayarlarının bulunduğun bir "skin" vardır. Bun nesnedeki tüm 
                renklerin "alpha" değerini değiştiriyor. */
            case EGET_SCROLL_BAR_CHANGED:
                if (id == 104)
                {
                    s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos();

                    for (u32 i = 0; i < EGDC_COUNT; ++i)
                    {
                        SColor col = env->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);
                        col.setAlpha(pos);
                        env->getSkin()->setColor((EGUI_DEFAULT_COLOR)i, col);
                    }

                }
                break;
                /*
                  3 butonumuz var. Bunlardan biri tıklandığında ona göre işlev yapılmatadır. Tıklanan buton id 
                  numarasına göre işlev yaptırmak mümkündür. id == 101 nolu buton irrlicht oyun motorunu kaptıyor. 
                  Yani tüm pecereyi kapatıyor. id == 102 nolu buton tıklandığında içinde yazı bulunan pencere açıyor. 
                  id == 103 nolu buton tıklandığında ise dosya açma arayüzü oluşturuyor ve liste kutusuna eylemi 
                  belirten yazı ekliyor. 
                */
            case EGET_BUTTON_CLICKED:

                if (id == 101)
                {
                    device->closeDevice();
                    return true;
                }

                if (id == 102)
                {
                    listbox->addItem(L”Window created”);
                    cnt += 30;
                    if (cnt > 200)
                        cnt = 0;

                    IGUIWindow* window = env->addWindow(
                        rect<s32>(100 + cnt, 100 + cnt, 300 + cnt, 200 + cnt),
                        false, // modal?
                        L”Test window”);

                    env->addStaticText(L”Please close me”,
                        rect<s32>(35, 35, 140, 50),
                        true, // border?
                        false, // wordwrap?
                        window);

                    return true;
                }

                if (id == 103)
                {
                    listbox->addItem(L”File open”);
                    env->addFileOpenDialog(L”Please choose a file.”);
                    return true;
                }

                break;
            default:
                break;
            }
        }

        return false;
    }
};

/*
  Yukarıdaki kodda ise bir Device oluşturuluyor. Kullanıcıya bu sürücülerden hangisini kullanması gerektiği 
  bir souruyor. Bunlar EDT_DIRECT3D9, EDT_DIRECT3D8, EDT_OPENGL, EDT_SOFTWARE ve EDT_SOFTWARE2. Yani bu sürücüler 
  sırasıyla Directx9, Directx8, OpenGL ve Software’ dir. burada neden Directx10 yok derseniz; şuan Kasım ayı 2008 
  tarihinde en sonra Irrlicht 1.4.2 sürümüne göre dersimizi anlattık. Bu sürüm Directx 10 desteklememektedir ve 
  ileride mutlaka çıkacaktır. Sürümleri takip etmeniz gerekir.
*/

int main()
{
    // ask user for driver

    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) Burning’s 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_BURNINGSVIDEO; break;
    case ‘f’: driverType = video::EDT_NULL;     break;
    default: return 1;
    }

    // create device and exit if creation failed

    device = createDevice(driverType, core::dimension2d<s32>(640, 480));

    if (device == 0)
        return 1; // could not create selected driver.

    //Burada oluşturduğumuz sınıf düzenlemelerini ayarlayıp ve "VideoDriver" ve "GUIEnvironment" nesnelerine birer gösterici tanımlıyoruz. 
    MyEventReceiver receiver;
    device->setEventReceiver(&receiver);
    device->setWindowCaption(L”Irrlicht Engine - User Interface Demo”);

    video::IVideoDriver* driver = device->getVideoDriver();
    IGUIEnvironment* env = device->getGUIEnvironment();

    //Yazı tipi değişikliği için bir font yüklüyoruz.Yeni bir font oluşturmak için irrlicht klasörü içinde bir font aracı gelmektedir.
    IGUISkin* skin = env->getSkin();
    IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");
    if (font)
        skin->setFont(font);

    skin->setFont(env->getBuiltInFont(), EGDF_TOOLTIP);

    /*
      Penceremize 3 buton ekliyoruz.Birince buton Penceremizi kaptıyor.Ikinci buton Pencere oluştuyor ve 
      üçüncü butonumuz ise bir dosya açma arayüzü oluşturuyor.Id numarası ile oluşturduğumuz sınıftan ne 
      işlev yapmasını gerektiğini ulaşıyoruz.
    */
    env->addButton(rect<s32>(10, 240, 110, 240 + 32), 0, 101, L"Quit", L"Exits Program");
    env->addButton(rect<s32>(10, 280, 110, 280 + 32), 0, 102, L"New Window", L"Launches a new Window");
    env->addButton(rect<s32>(10, 320, 110, 320 + 32), 0, 103, L"File Open", L"Opens a file");

    //Sabit bir yazı ve bir kaydırma çubuğu ekliyoruz. Kaydırma çubuğunu maxisimum değerini 255 olarak ayarlıyoruz. 
    env->addStaticText(L"Transparent Control : ", rect<s32>(150, 20, 350, 40), true);
    IGUIScrollBar* scrollbar = env->addScrollBar(true, rect<s32>(150, 45, 350, 60), 0, 104);
    scrollbar->setMax(255);

    scrollbar->setPos(env->getSkin()->getColor(EGDC_WINDOW).getAlpha());
    //Bir sabit yazı ve litst box oluşturuyoruz. 
    env->addStaticText(L"Logging ListBox : ", rect<s32>(50, 110, 250, 130), true);
    listbox = env->addListBox(rect<s32>(50, 140, 250, 210));
    env->addEditBox(L"Editable Text", rect<s32>(350, 80, 550, 100));

    //Irrlicht logomuzu 10.10 pozisyonuna ekliyoruz. 
    env->addImage(driver->getTexture("../../media/irrlichtlogo2.png"), position2d<int>(10, 10));

    //Şimdi yaptığımız tüm nesneleri çizdiyoruz. Ve arkaplan rengimizi ayarlıyoruz
    while (device->run() && driver)
        if (device->isWindowActive())
        {
            driver->beginScene(true, true, SColor(0, 200, 200, 200));
            env->drawAll();
            driver->endScene();
        }

    device->drop();

    return 0;
}
Samed Ceylan

Yorumlar

Bu blogdaki popüler yayınlar

SDL Nedir?

Doxygen Kullanımı

OpenGL'de Line (çizgi) Çizdirme