L’interfaccia utente di Irrlicht (GUI)

Tutorial Irrlicht: GUI
Testo originale: http://irrlicht.sourceforge.net/tut005.html
Traduzione di Dak: dak.netsons.org

Includiamo prima di tutto i file header ed usiamo i namespaces di irrlicht. Inizializziamo un puntatore per il device di irrlicht, una variabile per cambiare ogni volta la posizione per la crazione di una nuova finestra ed un puntatore per la listbox.

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

using namespace irr;

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

IrrlichtDevice *device = 0;
s32 cnt = 0;
IGUIListBox* listbox = 0;

Il ricevitore di eventi in irrlicht, e' anche capace di catturare gli eventi per le GUI fatte con irrlicht, oltre che gli eventi tastiera o mouse. Esistono eventi per tutto, pressione di un tasto, cambiamento di selezione in una listbox, e cosi' via. Per reagire agli eventi della gui, viene preso in considerazione l'id di chiamata (l'elemento della gui che ha causato l'evento) ed otteniamo il puntatore a quell'elemento della GUI.

class MyEventReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(SEvent event)
{
if (event.EventType == EET_GUI_EVENT)
{
s32 id = event.GUIEvent.Caller->getID();
IGUIEnvironment* env = device->getGUIEnvironment();

switch(event.GUIEvent.EventType)
{

Se viene cambiata la posizione dello scroll in una ScroolBar(assocciata all'id 104), viene cambiata la trasparenza degli elementi della GUI. Come vedete, e' molto semplice: viene assegnato agli oggetti della Gui, il livello di trasparenza assegnato con la scroolbar.

case EGET_SCROLL_BAR_CHANGED:
if (id == 104)
{
s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos();

for (s32 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;

Se un tasto viene premuto, potrebbe comunque essere uno dei nostri 3 tasti; se e' stato premuto il primo, interrompiamo il game engine, ed usciamo dal gioco. Se e' il secondo, creiamo una finestra con del testo dentro; inoltre aggiungiamo alla listbox l'evento di creazione di una finestra. Se invece viene premuto il terzo tasto, apriamo una finestra di scelta file e aggiungiamo questo evento alla listbox. Ora abbiamo terminato la gestione degli eventi.

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;
}
}
return false;
}
};

Ok, ora creiamo il device e chiediamo che rendering usare.

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) 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 1;
}

// create device and exit if creation failed
device = createDevice(driverType, core::dimension2d<s32>(640, 480));

if (device == 0)
return 1;

La creazione del device e' stata fatta, ora settiamo il puntatore del ricevitore di eventi e creiamo dei puntatori per il driver e la gestione della Gui.

MyEventReceiver receiver;
device->setEventReceiver(&receiver);
device->setWindowCaption(L"Irrlicht Engine - User Inferface Demo");

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

Aggiungiamo ora i 3 tasti, il primo per chiudere il programma, il secondo per creare la finestra ed il terzo per la finestra di scelta file. Il terzo parametro e' l'id del tasto, da usare nel ricevitore di eventi.

env->addButton(rect<s32>(10,210,100,240), 0, 101, L"Quit");
env->addButton(rect<s32>(10,250,100,290), 0, 102, L"New Window");
env->addButton(rect<s32>(10,300,100,340), 0, 103, L"File Open");

Ora aggiungiamo del testo statico e la scrollbar, per modificare la trasparenza della GUI. Settiamo come massimo valore 255 perche' e' il colore massimo per il valore alpha. Creiamo poi un altro testo statico e la listbox.

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);

env->addStaticText(L"Logging ListBox:", rect<s32>(50,80,250,100), true);
listbox = env->addListBox(rect<s32>(50, 110, 250, 180));

Per creare le scritte, caricheremo una font esterna nella skin. Creiamo poi il logo di Irrliche nell'angolo di sinistra.

IGUISkin* skin = env->getSkin();
IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");
if (font)
skin->setFont(font);

IGUIImage* img = env->addImage(
driver->getTexture("../../media/irrlichtlogoalpha.tga"),
position2d<int>(10,10));

Diamo inizio al loop di rendering.

while(device->run() && driver)
if (device->isWindowActive())
{
driver->beginScene(true, true, SColor(0,122,65,171));
env->drawAll();
driver->endScene();
}

device->drop();
return 0;
}


Lascia un commento