full screen background image

Desenvolvendo um Jogo Digital do Zero: Parte 15 – Término do jogo e HUD

Desenvolvendo um Jogo Digital do Zero: Parte 15 – Término do jogo e HUD

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:

http://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.

Figura 1 - Jogador perdendo

Figura 1 – Jogador perdendo

Figura 2 - Jogador ganhando

Figura 2 – Jogador ganhando

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



Santiago Viertel

Formado em Bacharelado em Ciência da Computação (UDESC), mestre e doutorando em Análise de Algoritmos (UFPR). Atualmente é programador da Céu Games (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.


Show Buttons
Hide Buttons