miércoles, 8 de abril de 2015

Manejo de Eventos GUI en Irrlicht


Descargar Assets para este proyecto


#include <irrlicht.h>

//los namespace para definir funciones de irrlicht
using namespace irr;
using namespace core;
using namespace video;
using namespace gui;

#if defined(_MSC_VER)
#pragma comment(lib, "Irrlicht.lib")
#endif

//Creo una struct para definir mi contexto
struct SAppContext
{
 IrrlichtDevice *device;
};

//Defino valores para identificar las acciones que realizaran los botones
enum
{
 QUIT = 101,
 NEW
};

//Creo una clase para definir los eventos y sus acciones al presionar los botones
class MyEventReceiver : public IEventReceiver
{
public:
 //Inicializo mis valores en el contructor
 MyEventReceiver(SAppContext & context) : Context(context)
 {

 }

 //Creo una funcion virtual para manejar el evento
 virtual bool OnEvent( const SEvent &event )
 {
  //Si es un evento de gui
  if (event.EventType == EET_GUI_EVENT)
  {
   s32 id = event.GUIEvent.Caller->getID();
   IGUIEnvironment *guiEnv = Context.device->getGUIEnvironment();

   //Si se a presionado el boton
   if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
   {
    //Cierra la aplicacion
    if (id == QUIT)
    {
     Context.device->closeDevice();
     return true;
    }

    //Crea una ventana nueva
    if (id == NEW)
    {
     IGUIWindow *window = guiEnv->addWindow(rect<s32>(100, 100, 300, 200),
      false, L"Ventana Nueva");
     return true;
    }
   }
  }

  return false;
 }

private:

 //Variable del struct que construimos
 SAppContext & Context;
};

int main()
{
 //define un device para la pantalla
 IrrlichtDevice *device = createDevice(EDT_OPENGL, dimension2d<u32>(640, 480), 16, false,
  false, false, 0);

 //en caso de error
 if (!device)
  return 1;

 //Creo un driver de video
 IVideoDriver *driver = device->getVideoDriver();

 //Agrego componente del GUI o Interfaz Grafica de Usuario.
 IGUIEnvironment *guiEnv = device->getGUIEnvironment();

 //Establesco una fuente mediante un archivo xml que se encuentra en media de la carpeta de irrlicht
 IGUIFont *font = guiEnv->getFont("lucida.xml");

 //le agrego un texto y la posicion
 guiEnv->addStaticText(L"Hola a todos", rect<s32>(100, 20, 200, 30), true);

 //Agrego un boton para Salir
 guiEnv->addButton(rect<s32>(250, 20, 250 + 120, 50), 0, QUIT, L"Salir", L"presiona para cerrar programa");

 //Agrego un boton para crear nueva ventana
 guiEnv->addButton(rect<s32>(400, 20, 400 + 120, 50), 0, NEW, L"Nueva Ventana", L"Presiona para crear nueva ventana");

 //Creo un contexto con el struct que creamos
 SAppContext context;

 //le asigno mi device
 context.device = device;

 //Creo un objeto de mi clase
 MyEventReceiver receiver(context);

 device->setEventReceiver( &receiver );

 //Gameloop
 while (device->run())
 {
  driver->beginScene(true, true, SColor(255,255,255,255));
 
  //muestro el texto
  guiEnv->drawAll();

  //Dibujo otro texto
  font->draw(L"GUI en Irrlicht", rect<s32>(300, 300, 300, 50), SColor(255, 25, 25, 255));

  driver->endScene();
 }

 //cerrar device
 device->drop();

 return 0;
}




No hay comentarios:

Publicar un comentario