Então, hoje finalizaremos mais um conjunto de tutoriais em Cocos2d-x. Teremos um jogo de sinuca no nosso portfólio de jogos.
Bora finalizar mais esse projeto.
Parte 1 – Parte 2 – Parte 3 – Parte 4 – Parte 5 – Parte 6
No último tutorial nós implementamos o sistema de caçapas do nosso jogo de sinuca. Com isso, nós já temos implementado praticamente todo o mecanismo de um jogo desse tipo. Falta apenas dar os toques finais para termos um jogo bem acabado. Implementaremos no tutorial de hoje o sistema de pontuação, HUDs e término do jogo.
Modificações iniciais
Como o tutorial de hoje é mais breve, podemos iniciá-lo pensando em todas as modificações a serem realizadas no arquivo “HelloWorldScene.h”. Faremos com que a pontuação seja a quantidade de tacadas já realizadas pelo jogador. Como de praxe, precisamos mostrar essa informação a ele. Então, criaremos uma etiqueta para isso. Como essa etiqueta será modificada no decorrer do jogo, precisaremos criar um atributo na classe “HelloWorld” que armazena uma referência a ela.
Além disso, nós implementaremos todas as sub-rotinas de término do jogo em um método, que nomearemos como “endGame”. Dessa forma, criaremos um atributo e declararemos o protótipo de um método na classe “HelloWorld”. Abra o arquivo “HelloWorldScene.h” e adicione as seguintes linhas de código:
cocos2d::Label* tacadas;
void endGame();
logo abaixo dessa:
cocos2d::EventListenerTouchOneByOne* toqueNaTela;
Salve e feche esse arquivo, pois já fizemos todas as modificações necessárias.
Pontuação e HUDs
Como dito, a pontuação será a quantidade de tacadas realizadas pelo jogador. Alguns programadores pensariam na hipótese de adicionar mais um atributo na classe “HelloWorld” que conta a quantidade de tacadas já realizadas. Porém, para o nosso contexto, isso não é necessário. Podemos criar uma variável estática dentro do método “onTouchEnded” com essa função. Isso é válido porque incrementamos a quantidade de tacadas somente nesse método. Essa forma de implementar o contador de tacadas é mais direta e simples.
Antes de tudo, vamos adicionar na tela a etiqueta que mostra a quantidade de tacadas já realizadas. Abra o arquivo “HelloWorldScene.cpp” e adicione as seguintes linhas e código:
HelloWorld::tacadas = Label::createWithTTF(“Tacadas: 0″,”fonts/Marker Felt.ttf”,30);
HelloWorld::tacadas->setAnchorPoint(Vec2(0.5,1.0));
HelloWorld::tacadas->setPosition(Vec2(visibleSize.width/2,visibleSize.height));
addChild(HelloWorld::tacadas);
logo abaixo dessa:
addChild(HelloWorld::seta);
Para somar a quantidade de tacadas, adicione as seguintes linhas de código:
static int contTacadas = 0;
char txt[13];
contTacadas++;
sprintf(txt,”Tacadas: %i”,contTacadas);
HelloWorld::tacadas->setString(txt);
logo abaixo dessas:
schedule(schedule_selector(HelloWorld::paraBolaBranca),t);
schedule(schedule_selector(HelloWorld::encacapar));
Agora nos preocuparemos com o término do jogo.
Finalizando o jogo em Cocos2d-x
Quando o jogo acabar, uma etiqueta será adicionada na tela informando o jogador sobre o fato. Além disso, a etiqueta de HUD que mostra a quantidade de tacadas realizadas será reposicionada na tela para que ela tenha maior foco. Ambas as etiquetas serão posicionadas no centro, de forma que aquela responsável por informar o término fique acima daquela que mostra a quantidade de tacadas. Implementaremos essa sub-rotina no método “endGame”. Adicione no final do arquivo “HelloWorldScene.cpp” as seguintes linhas de código.
void HelloWorld::endGame() {
Size size = Director::getInstance()->getVisibleSize();
Label* fdj = Label::createWithTTF(“Fim de Jogo”,”fonts/Marker Felt.ttf”,40);
fdj->setAnchorPoint(Vec2(0.5,0.0));
fdj->setPosition(Vec2(size.width/2,size.height/2));
addChild(fdj);
HelloWorld::tacadas->setPosition(Vec2(size.width/2,size.height/2));
}

Agora, basta chamarmos o método “endGame” no momento que o jogo acabar. Tal momento acontece em duas situações: quando a última bola for encaçapada, sendo que a bola branca já estará parada, e; quando a bola branca parar de se movimentar na jogada que a última bola foi encaçapada. Assim, adicione nos métodos “paraBolaBranca” e “encacapar” as seguintes linhas de código:
if(!HelloWorld::bolaVermelha->getParent()&&!HelloWorld::bolaAmarela->getParent())
HelloWorld::endGame();
else
logo acima dessa:
HelloWorld::toqueNaTela->setEnabled(true);
Para finalizarmos o jogo em Cocos2d-x de vez, basta retirarmos aquela linha de código que adicionamos no segundo tutorial para executar o debug draw. Apague a seguinte linha de código.
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
Agora sim, compile o código e execute o jogo. Note que o nosso jogo tem os principais mecanismos de um jogo de sinuca. O término do jogo é ilustrado na Figura 1 e a execução dele é mostrada no vídeo a seguir.
Finalizamos no tutorial de hoje a implementação de um jogo simples de sinuca em Cocos2d-x. Adicionamos o sistema de pontuação, que conta e mostra ao jogador a quantidade de tacadas realizadas, e o término do jogo. Com isso, nós terminamos mais um conjunto de tutoriais. Weee. \o
Iniciaremos no próximo tutorial a implementação de um jogo de batalha naval. Esse é mais um conjunto de tutoriais feito a pedidos de nossos fiéis leitores, que têm nos ajudado muito com ideias de conteúdos. Muito obrigado e continuem assim. ;D
Um grande abraço e até mais. []