<< Voltar Índice Próxima >>

SPLASH SCREEN,
CONFIGURAÇÕES DA OGRE,
SCENEMANAGER
E CÂMERA

Splash Screen

O projeto começa a ser executado a partir do arquivo main.c, nele estão os includes básicos da ogre(Ogre.h e OgreException.h) além do windows.h para o uso de algumas funções do windows. O arquivo Inicializa.h é da classe Inicializa a qual definiremos as configurações da ogre, além das malhas e outros elementos que iremos utilizar.

#include "Inicializa.h"
#include "Ogre.h"
#include "OgreException.h"
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#include "stdafx.h"
#include "Splash.h"

No projeto foi adicionada uma classe CSplash para que o programa tenha uma splash screen, que é aquela tela que aparece quando o programa é aberto, isso é opcional. Os arquivos stdafx.h e Splash.h são os arquivos para a isso.

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
{
   //adiciona a tela de abertura
   CSplash splash;
   splash.SetBitmap(TEXT("..\\..\\media\\materials\\textures\\iraonline2.bmp"));
   //define a cor da transparencia
   //splash.SetTransparentColor(RGB(128, 128, 128));
   splash.SetTransparentColor(RGB(255, 255, 255));
   splash.ShowSplash();
   //tempo q fica na tela
   Sleep(4000);
   //para a tela de abertura
   splash.CloseSplash(); 

 

Depois de criado o objeto "splash" usamos o método "SetBitmap()" para definir a imagem, que deve ser no formato bitmap(.bmp). "SetTransparentColor()" é utilizado para determinar a cor que será considerada tranparente, no código a cor que está transparente é a branca.

Com a função "Sleep()" estabele o tempo que a imagem ficará na tela em milisegundos, caso queira que ela não apareça, enquanto você estiver desenvolvendo o seu programa, basta colocar o tempo como zero ou comente todo o trecho de código do Splash Screen.

Configurações da Ogre

   try
   {
      iInicializa.Vai();
   }
   catch( Ogre::Exception& e )
   {
      catch( Ogre::Exception& e )
   {
      MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", 
	  		MB_OK | MB_ICONERROR | MB_TASKMODAL);
   }
   }
   return 0;
}

 

Esse trecho de código começa a execução da Ogre, através do método "Vai()" da classe Inicializa que chamará os outros. O restante do código acima é executado caso aconteça algum erro.

As classes do projeto foram dividas em arquivos, em um deles estão definidas as variáveis(atributos), includes e nomes dos métodos da classe(arquivos .h) e no outro está a implementação da classe propriamente dita(arquivos .cpp).

#include "AplicationListener.h"
using namespace Ogre;

 

Na classe Inicializa que cuida da configuração e declaração das malhas a serem utilizadas no jogo, incluimos no arquivo "Inicializa.h", o include "AplicationListener.h" porque nesta classe está o loop do jogo, a qual será explicado futuramente.

A linha "using namespace Ogre;" é utilizada para evitarmos repetições da palavra Ogre sempre que fizermos referência a algum membro de sua biblioteca. Por exemplo na definição de uma entidade, deveriamos declarar da seguinte forma:

Ogre::Entity

E usando o recurso do namespace podemos declarar usando somente a palavra Entity.

bool Inicializa::Vai(void)
{
   Configura();
     
   CarregaMalhas(); 
   aplicationListener = new AplicationListener(root, window, camera, scene_mgr);
   root->addFrameListener(aplicationListener);
   root->startRendering();
   return true;
}

 

Passando para o arquivo Inicializa.cpp, o método "Vai()" irá invocar outros métodos e iniciar a renderização, um deles é o "Configura()". Ao contrário dos tutoriais e exemplos da Ogre não será utilizada a classe ExampleApplication no projeto, dessa forma não aparecerá a tela de configuração da Ogre, onde define-se por exemplo a resolução da tela, isso será feito em código no método "Configura()".

bool Inicializa::Configura()
 { 
 //lê os arquivos de configuração
   root = new Root("plugins.cfg","display.cfg","log.txt");

 

O root é o ponto de início da Ogre, ele é criado antes de qualquer outro elemento. Nessa linha também passamos os arquivos de configuração que serão utilizados no programa, eles estão na pasta onde está o executável do programa. O arquivo "plugins.cfg" contém os plugins a serem usados e "log.txt" conterá as informações de execução, caso o programa pare de repente sem nenhum motivo aparente, é importante que este arquivo seja verificado para encontrar o problema.

 //leitura do arquivo onde estao os arquivos usados no programa
 Ogre::ConfigFile cf;
 cf.load("resources.cfg"); 

 

O arquivo "resources.cfg" contém os diretórios onde estão os modelos, fontes, scripts, texturas entre outros elementos que irão fazer parte do jogo.

 //Inicio dos comandos para a leitura de todos caminhos para os arquivos
 Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
 Ogre::String sec_name, type_name, arch_name;
 while (seci.hasMoreElements())
 {
   sec_name = seci.peekNextKey();
   Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
   Ogre::ConfigFile::SettingsMultiMap::iterator i;
   for (i = settings->begin(); i != settings->end(); ++i)
   {
   type_name = i->first;
   arch_name = i->second;
   Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
   arch_name, type_name, sec_name);
   }
 }

 

O trecho acima de código irá ler todas as linhas do arquivo "resources.cfg" para serem usadas no jogo.

 //procura do sistema de renderização
 RenderSystemList *rs_list = root->getAvailableRenderers();
 int c = 0;
 bool foundit = false;
 RenderSystem *selectedRenderSystem = 0;
 while(c < (int) rs_list->size())
 {
    selectedRenderSystem = rs_list->at(c);
    String rname = selectedRenderSystem->getName();
    //if(rname.compare("OpenGL Rendering Subsystem")==0)
    if(rname.compare("Direct3D9 Rendering Subsystem")==0)
    {
       foundit = true;
       break;
    }
    c++; // <-- oh how clever
 }
 //se nao encontrou o sistema de renderização
 if(!foundit) return 0;

 

Procura pelo sistema de renderização, aqui é feita a escolha entre OpenGL e DirectX, basta descomentar uma das linhas abaixo, de acordo com o sistema que escolher.

if(rname.compare("Direct3D9 Rendering Subsystem")==0) ou
if(rname.compare("OpenGL Rendering Subsystem")==0)
 //configurando o sistema de renderização
 selectedRenderSystem->setConfigOption("Full Screen","No");
 selectedRenderSystem->setConfigOption("Video Mode","800 x 600 @ 32-bit colour");

 

No trecho acima é escolhido se o jogo rodará em tela cheia(Full Screen), a resolução da tela além de escolher a qualidade da cor, 16 ou 32 bits. Se escolher 16 bits por exemplo, defina esse mesmo valor nas configurações de video do windows, caso contrário poderá ter problemas de execução.

 //cria a janela da renderização
 window = root->initialise(true,"IRAonline");

 

A linha cria a janela onde será renderizada as imagens, o primeiro parâmetro determina se a janela será automaticamente criada e o segundo o título da janela. Observe que a janela e alguns outros elementos como o SceneManager(Gerenciador da cena) são criados apartir do root.

//cria o gerente da cena
 scene_mgr = root->createSceneManager(Ogre::ST_EXTERIOR_CLOSE, "ExampleSMInstance");

 

O SceneManager conterá todos os elementos que irão fazer parte do ambiente 3D, como modelos, luzes, partículas, etc. Todas as informações destes elementos serão guardados e manipulados pelo SceneManager. Existem vários tipos de SceneManagers, entre eles estão:

ST_EXTERIOR_CLOSE: Para ambientes abertos não muito extensos, como no nosso texto.
ST_EXTERIOR_FAR: Ambientes abertos extensos.
ST_EXTERIOR_REAL_FAR: Para ambientes muito extensos, como no caso dos MMORPG's. Nesse caso é o utilizado o plugin Paging Scene Manager(PLSM2) que tem como um dos seus recursos a transição entre os mapas sem parar o jogo para leitura, assim como em GTA 3 e Lineage II.
ST_INTERIOR: Utilizado quando o ambiente do jogo é um cenário do tipo BSP, formato utilizado no jogo Quake III.

Para informações mais detalhadas visite a seguinte página do wiki da Ogre.

//cria uma camera
 camera = scene_mgr->createCamera("PlayerCam");
 //distancia a qual a camera começa a renderizar
 camera->setNearClipDistance(5);

 

A câmera permite que os elementos que compõem a cena sejam visto, e possui um comportamento semelhante ao um SceneNode(Nó da cena), que será tratado mais a frente. A função "createCamera()" cria uma câmera associada a um SceneNode. O parâmetro é o nome dado a câmera, que deve ser único, para um acesso posterior através do gerenciador de cena através da função "getCamera()", como no exemplo:

scene_mgr->getCamera("PlayerCam");

Através da função "setNearClipDistance()" é determinada a distância minima apartir da câmera em que a cena será renderizada.

//cria um viewport
 vp = window->addViewport(camera);
 //define as dimensões da janela que a camera ira renderizar
   camera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));

 

O Viewport é a área da janela em que a câmera associada ao viewport irá renderizar suas imagens. Isso é muito útil em jogos em que é necessário dividir a tela entre dois jogadores, como em Neef For Speed ou Top Gear(figura abaixo) em que um viewport associado a uma câmera mostra as imagens do jogador 1 enquanto que um outro viewport associado a uma outra câmera mostra as imagens do jogador 2.


Italo Mendes
italo.ribeiro@gmail.com

<< Voltar Índice Próxima >>