miércoles, 28 de abril de 2010

BaseApplication.h y cpp

En este tutorial vamos a explicar la Clase BaseApplication, que se encuentra su declaracion de clase en BaseApplication.h ( abreviaré con H), y el desarrollo de la misma en BaseApplication.cpp ( abreviaré con CPP ). Esta clase se genera una vez creado el proyecto con el AppWizard del VS2008, por lo que podemos modificarla y crear la nuestra propia, pero esta clase es la que contiene basicamente casi todas la funcionalidades, para el nivel de los tutoriales mas basicos.

El codigo:

class BaseApplication : public Ogre::FrameListener, public Ogre::WindowEventListener, public OIS::KeyListener, public OIS::MouseListener, OgreBites::SdkTrayListener
{
public:
BaseApplication(void);
virtual ~BaseApplication(void);


virtual void go(void);


protected:
virtual bool setup();
virtual bool configure(void);
virtual void chooseSceneManager(void);
virtual void createCamera(void);
virtual void createFrameListener(void);
virtual void createScene(void) = 0; // Override me!
virtual void destroyScene(void);
virtual void createViewports(void);
virtual void setupResources(void);
virtual void createResourceListener(void);
virtual void loadResources(void);
virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);


virtual bool keyPressed( const OIS::KeyEvent &arg );
virtual bool keyReleased( const OIS::KeyEvent &arg );
virtual bool mouseMoved( const OIS::MouseEvent &arg );
virtual bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id );
virtual bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id );


//Adjust mouse clipping area
virtual void windowResized(Ogre::RenderWindow* rw);
//Unattach OIS before window shutdown (very important under Linux)
virtual void windowClosed(Ogre::RenderWindow* rw);

En la primera linea vemos como se declara la clase y empieza a heredar de otras, de la librearia de Ogre, las que vamos a detallar a continuación:

  • FrameListener : Esta clase, para para escojer eventos entre Frames, realizando busqueda por internet cito lo siguiente. Un “listener” (oyente) es una interfaz diseñada para ser llamada cuando ocurren ciertos eventos. Esta clase (FrameListener) define la interfaz que se relaciona a eventos de cuadros (frame). Lo anterior significa que si yo defino un FrameListener, mi aplicación sería capaz de realizar acciones entre cuadro y cuadro. Lo más común es utilizarlo para la captura de eventos de teclado y ratón, o para actualizar el movimiento y la posición de los diferentes objetos ya sea manualmente, o también por medio de alguna biblioteca de simulación de físicas, aunque no está limitado a esas tareas. Siempre que tengamos alguna acción que queramos realizar en cada cuadro, entonces debemos utilizar un FrameListener. La clase FrameListener contiene 2 métodos virtuales, frameStarted() y frameEnded(). El método frameStarted() es llamado al inicio del cuadro, antes de hacer la actualización de la escena, y el método frameEnded() es llamado después de haber hecho la actualización de la escena y antes de actualizar el siguiente cuadro. Ambos métodos regresan un valor boolean, que le indica al motor gráfico si debe seguir actualizando, o salir del ciclo de actualización (render). Si no re-definimos estos métodos, el valor por defecto es true, o sea, seguir actualizando.
  • Los métodos frameStarted() y frameListener() tienen además un parámetro de tipo FrameEvent. Este FrameEvent no es mas que una estructura que contiene información acerca del evento, básicamente el tiempo transcurrido (en segundos) desde el último evento (timeSinceLastEvent) y el tiempo transcurrido desde el último cuadro (timeSinceLastFrame). La diferencia entre uno y otro valor es que el primero nos cuenta el tiempo que ha pasado de frameStarted() a framEnded() y viceversa, y el otro el tiempo de frame a frame, o sea de frameStarted() a frameStarted() y de frameEnded() a frameEnded(). De la web: Diario de un programador
  • WindowEventListener: Es para recojer eventos de ventana, en el H y CPP, se implementas los metodos windowClosed y windowResize, que explicaremos mas a delante.
  • MouseListener y KeyListener: Pues como su nombre indica, para recojer eventos de teclado y raton, por ejemplo el keyPressed, para recojer las teclas pulsadas, todos estos metodos por parametro se le pasa un KeyEvent o MouseEvent, que son los que llevan la información del evento.
  • OgreBites::SdkTrayListener: Es el oyente de eventos de Botones, Labels, es una utilidad que carga y crea todo tipo de utulidades basicas, como por ejemplo el ProgressBar.

Estos son alguno de los objetos mas relevantes que detallaremos a continuación:

  • Ogre::Root *mRoot; Es el objeto raiz, donde se crea la ScenaManager y se instala puglins, muchas mas opciones uqe veremos mas adelante, si hacemos un simil con la pintura el mRoot sería el pintor.
  • Ogre:: Camera *Camera; Es la camara, el objeto que se configurá con su ViewPort, para su uso.
  • gre::SceneManager* mSceneMgr; Es la escena de todo tu aplicación, la que de ella cuelga todos los SceneNodes, y demas objetos, si seguimos con el simil de pintura, el SceneNode es el pinzel, la SceneManager es el lienzo.
  • Ogre::RenderWindow* mWindow; Es la ventana fisica del S.O., la que tenemos que pasarle los yentes de teclado y raton. Con ella se pude sacar información del usuario, por ejemplo el tamaño de ventana, para configurar el ViewPort de la camara.
  • Ogre::String mResourcesCfg, Ogre::String mPluginsCfg; Sion las rutas de los ficheros resources.cfg y puglins.cfg
  • OgreBites::SdkTrayManager* mTrayMgr; Es el objeto que cargará los modelos de Utilidades de Botones, progressBar, Logo, hará de yente de los mismos para su uso. Tiene mas utilidades que veremos poco a poco.
  • OgreBites::SdkCameraMan* mCameraMan; Es el controlador basico de la camra, con ella se le pueden pasar los eventos del raton, para poder moverla con libertad
  • OgreBites::ParamsPanel* mDetailsPanel; Es un panel grafico para representar datos, que se crea y configura con el SdkTrayListener

En los siguientes tutoriales, seguiremos explicando un poco el funcionamiento de Ogre.

No hay comentarios:

Publicar un comentario

Gracias por tu comentario! :)