Estamos caminhando para o término dos artigos de programação do Shark Pong.
Relembrando, já programamos a interação com o jogo digital, o sistema de física e colisões, a inteligência artificial do NPC e o power up do polvo. Ufa…
Está faltando apenas finalizarmos a implementação do término do jogo, HUDs e a inclusão das animações projetadas pelo Filipe.
Todas as partes da saga:
https://fabricadejogos.net/colunas/producao-jogo-digital-do-zero
Implementamos no último artigo a funcionalidade do power up do polvo. Fizemos com que ele aparecesse no mar de tempos em tempos e, caso o tubarão passasse por cima dele, um dos dois surfistas perdia o controle por um tempo.
Nesse artigo veremos como implementar o sistema que detecta quando o tubarão passa das linhas imaginárias que delimitam o cenário. Elas são aquelas linhas que definem o ganhador do jogo, ou seja, que passam sobre os dois surfistas. Quando for detectado que o tubarão passou para trás de uma das linhas, o jogo será finalizado e será mostrada uma mensagem na tela informando se o jogador ganhou ou se perdeu. Partiu.
Iniciaremos o artigo com a edição do código existente no arquivo “HelloWorldScene.h”. Abra esse documento e adicione o protótipo do único método que implementaremos hoje. Escreva a seguinte linha de código:
void acabaJogo(bool jogador);
logo abaixo dessa:
float posicaoInicialTubarao[2];
Perceba que o nome do método é bastante sugestivo. Ele será chamado quando o tubarão passa de uma das linhas imaginárias. O parâmetro, nomeado “jogador”, será verdadeiro se o jogador perdeu, ou falso, caso contrário. Salve esse arquivo e abra “HelloWorldScene.cpp”.
Primeiramente, retiraremos um código que, a partir de hoje, será inútil para o jogo. Note que o tubarão, na versão atual do jogo, rebate no final da tela do aparelho sem que haja qualquer validação de término de jogo. Assim, o jogo fica interminável com o tubarão apenas voltando ao cenário do jogo. Dessa forma, o código que faz com que o tubarão volte ao cenário pode ser substituído pela validação que identifica quando o tubarão passa dos surfistas. Pensando nisso, substitua as seguintes linhas de código:
if((HelloWorld::tubarao->getPositionX()<0&&HelloWorld::vetorDirecaoTubarao[0]<0)||
(HelloWorld::tubarao->getPositionX()>size.width&&HelloWorld::vetorDirecaoTubarao[0]>0)) {
HelloWorld::tempo = 0.0;
HelloWorld::vetorDirecaoTubarao[0] = -HelloWorld::vetorDirecaoTubarao[0];
HelloWorld::posicaoInicialTubarao[0] = HelloWorld::tubarao->getPositionX();
HelloWorld::posicaoInicialTubarao[1] = HelloWorld::tubarao->getPositionY();
rot = 180.0 – (180.0*acos(HelloWorld::vetorDirecaoTubarao[0]))/M_PI;
if(HelloWorld::vetorDirecaoTubarao[1]<0)
rot = 360.0 – rot;
HelloWorld::tubarao->setRotation(rot);
}
por essas:
if(HelloWorld::tubarao->getPositionX()<=0.1*size.width)
HelloWorld::acabaJogo(true);
else if(HelloWorld::tubarao->getPositionX()>=0.9*size.width)
HelloWorld::acabaJogo(false);
Se você for analisar a substituição, perceberá que excluímos um código que rebate o tubarão quando ele sai da tela horizontalmente. Além disso, adicionamos um código que verifica se o tubarão passa de um dos surfistas. Note que, caso um dos dois aconteça, o método “acabaJogo” é chamado. Obviamente, caso seja passado por parâmetro o valor verdadeiro, então o jogador perdeu.
Para finalizar, precisamos adicionar a implementação desse método para que o jogo funcione. Adicione as seguintes linhas de código no final do arquivo:
void HelloWorld::acabaJogo(bool jogador) {
CCLabelTTF* fimDeJogo;
CCSize size = CCDirector::sharedDirector()->getWinSize();
cleanup();
setTouchEnabled(false);
if(jogador) {
fimDeJogo = CCLabelTTF::create(“Voce Perdeu! =/”,“”,40);
fimDeJogo->setColor(ccc3(53,41,27));
} else {
fimDeJogo = CCLabelTTF::create(“Voce Ganhou! =]”,“”,40);
fimDeJogo->setColor(ccc3(198,180,240));
}
fimDeJogo->setPosition(ccp(size.width/2,size.height/2));
addChild(fimDeJogo);
}
O método “acabaJogo” realiza o processamento necessário para parar o jogo de vez e mostrar na tela se o jogador perdeu ou ganhou. Primeiramente, são parados de executar aqueles métodos chamados a cada quadro. Isso fará com que o jogo pare de vez. Além disso, a tela de toque é desligada e é criada uma mensagem de término do jogo. Essa mensagem pode ser “Você perdeu! =/” ou “Você ganhou! =]”. A coloração da mensagem também varia de acordo com o resultado do jogo. Logo após, a mensagem é posicionada no centro da tela e é apresentada ao jogador. O resultado é mostrado nas Figuras 1 e 2. A decisão das cores das mensagens foi embasada na paleta apresentada pelo Filipe em seu artigo.


Vimos nesse artigo como adicionar a checagem de término de jogo digital. Além de implementarmos tal funcionalidade, também paramos a execução do jogo e mostramos na tela um feedback ao jogador.
Falta pouco para terminarmos a parte de programação do jogo e logo passaremos a palavra à equipe da Quasar Sound Work. Antes, porém implementaremos no próximo artigo as animações projetadas pelo designer visual Filipe.
Um grande abraço e até mais. []