Ponto V!

Home Ogre 3D Aprimorando o protótipo de Pac-Man I
Jonathan Ohara de Araujo
Aprimorando o protótipo de Pac-Man IImprimir
Escrito por Jonathan Araujo

No artigo anterior, mostrei como criar seus próprios modelos 3D no Blender e exporta-los para formato .mesh do Ogre. Nesse artigo vamos aprimorar o protótipo Pac-Man adicionando alguns elementos essenciais para futuros artigos e inserindo a pontuação do jogo. Como esse artigo é uma continuação do protótipo de Pac-Man é essencial você ter lido o primeiro artigo.

Reestruturando o Protótipo

A principal mudança nesse protótipo é que criei uma classe chamada Square que vai ser responsável por cada quadradinho do cenário, terá informações como, por exemplo, se tem ou não comida nesse lugar, desse forma não será mais preciso modificarmos aquela matriz de caracteres que contém informações sobre os objetos do cenário.

Será criada então uma nova matriz de instâncias do objeto Square, veja o trecho a seguir:

Square cenarioSquare[LINHAS][COLUNAS];

Classe Square

Podemos encontrar dois novos arquivos em nosso projeto: Square.h (declaração da classe Square e de seus métodos) e Square.cpp(implementação).

A classe Square é composta por alguns atributos privados:

private:
    Ogre::Real x, y;

    bool muro, fantasma, pacMan, comidaPequena, comidaGrande;

Todos esses atributos privados podem ser acessados através de métodos getters and setters dessa classe:

//getters e setters

Ogre::Real getX();
void setX( Ogre::Real _x );

Ogre::Real getY();
void setY( Ogre::Real _y );

bool isComidaPequena();
void setComidaPequena( bool _comidaPequena );

bool isComidaGrande();
void setComidaGrande( bool _comidaGrande );

bool isMuro();
void setMuro( bool _muro );

bool isFantasma();
void setFantasma( bool _fantasma );

bool isPacMan();
void setPacMan( bool _pacMan );

Temos 2 construtores para essa classe: um sem nenhum parâmetro e outro passando X e Y:

Square();

Square(Ogre::Real _x, Ogre::Real _y);

E temos também o método criarNomeDeEntidadesNos que antigamente pertencia a classe tutorial.

Trabalharemos a partir de agora com esses atributos booleanos para identificar se existe comida, muro, fantasma ou o próprio Pac-Man.

Leitura do Cenário

A leitura da matriz de caracteres pouco mudou, agora durante a leitura da matriz de caracteres nós configuramos a matriz de Square. Por exemplo, para processar o caractere ‘X’ que representa os muros, o código ficou como:

case 'X':
    elementoNode = cenarioNode->createChildSceneNode( nomeCenarioNode );

    elementoEntidade = mSceneMgr->createEntity( nomeEntidade, "muro.mesh" );
                    
    elementoNode->setPosition( posicao );
    elementoNode->attachObject( elementoEntidade );

    square.setMuro( true );
    break;

Repare que a ultima instrução do case cuida de ligar o flag que indica que o Square daquela posição é um muro.

Com matriz de Square o código fica simples e intuitivo, pois onde havia:

if( botaoValido && destino != 'X' && destino != 'F' ){

Foi mudado para:

if( botaoValido && !destino->isMuro() && !destino->isFantasma() ){

Adicionado controle de Pontuação

Agora controlaremos a pontuação do jogo. Será criado um atributo privado e inteiro na classe Tutorial que vai ser usado para armazenar a pontuação:

int pontos;

Defini uma regra básica para contar a pontuação. Toda vez que o Pac-Man “pisar” em um Square com comida pequena é adicionado 10 pontos e ao “pisar” em um Square com comida grande é adicionado 100 pontos.

Adicionemos então a seguinte regra caso o lugar onde o Pac-Man va pisar seja comida:

if( destino->isComidaPequena() ){
    pontos += 10;
}else{
    pontos += 100;
}

GUI

GUI ou Graphics User Interface resumidamente é parte do jogo que fará a iteração direta com o jogador através de formulários e mensagens. Nesse momento vamos apenas mostrar uma Label (texto) contendo a pontuação do jogador.

Usaremos a GUI básica que já vem com o OGRE, ela não tem muitos recursos, mas vai suprir nossa necessidade. Você pode utilizar diversas outras GUI com o Ogre, as mais comumente usadas são a CEGUI e a MyGUI. Veja uma lista mais completa clicando aqui.

A GUI do Ogre é chamada de SdkTrays, repare que já temos alguma coisa em nosso código, mas usávamos ela apenas para criar o controle de mouse.

Vamos então criar um simples Label para colocar a pontuação atual do jogo. Vamos inserir uma nova chamada de método em criarCena:

bool criarCena(){
    criarInterfaceGrafica();

    criarCenario();

    // Cria Luz ambiente
    mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));

    // Cria uma Luz
    Ogre::Light* l = mSceneMgr->createLight("Luz");

    l->setPosition(0, 0, 100);

    // Começa a renderizar
    mRoot->startRendering();

    return false;
}

Declaramos na classe Tutorial um novo atributo privado do tipo Label:

OgreBites::Label *pontosLabel;

Agora vamos analisar como fica o método criarInterfaceGrafica:

void criarInterfaceGrafica(){

    pontosLabel = mTrayMgr->createLabel( OgreBites::TL_BOTTOMLEFT, "PontosLabel", "", 100);
    pontosLabel->setCaption("0");

    pontos = 0;

    mTrayMgr->showAll();
}

Para criar o label utilizaremos o método createLabel do SdkTrayManager, os parâmetros desse método são:

  • trayLocation: É a posição onde ficará Label, usamos o Enum TL_BOTTOMLEFT, ou seja, em baixo a esquerda, para facilitar;
  • name: É o nome do Label;
  • caption: A mensagem que será mostrada no label;
  • width: A largura do label;

Na segunda linha apenas trocamos a mensagem para o valor 0.

Na terceira linha iniciamos a variável pontos.

E depois tornamos todos os elementos visíveis.

Após isso sempre que modificamos a variável pontos iremos atualizar o label, veja o trecho a seguir:

if( destino->isComidaPequena() ){
    pontos += 10;
}else{
    pontos += 100;
}

pontosLabel->setCaption( Ogre::StringConverter::toString( pontos ) );

Conclusão

Nesse artigo melhoramos o protótipo por motivos de legibilidade e manutenabilidade, essas modificações serão muito importantes nos próximos artigos. Adicionamos também um simples Label para mostrar pontuação do jogo.

No próximo artigo sairemos um pouco do protótipo do Pac-Man para entrar mais fundo nessa GUI do Ogre, vamos ver outros elementos como botões, caixa de textos, etc. Também veremos alguns eventos como click e mouseOver.

download


Comentários (0)
Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter