Tutorial: Desenvolvendo um Jogo de Sinuca em Cocos2d-x: Parte 6 – HUDs e término do jogo

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 1Parte 2Parte 3Parte 4Parte 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

TacadaComo 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

credit_scoreComo 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));

}

Figura 1 - Final de jogo
Figura 1 – Final de jogo

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. []

Santiago Viertel

Formado em Bacharelado em Ciência da Computação (UDESC), mestre e doutorando em Análise de Algoritmos (UFPR). Foi programador da Céu Games por 8 anos. Possui a preferência por jogos de estratégia e de tiro em primeira pessoa. Jogando bastante DotA 2, Left 4 Dead 2 e Age of Empires II HD.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *