Tutorial: Desenvolvendo um Jogo ao Estilo Pokey Pummel em Cocos2d-x: Parte 4 – Cronômetro e Término do Jogo

Finalizaremos hoje a implementação de mais um jogo.

Até o momento, fizemos com que a pilha de pedras decrescesse a cada pedra quebrada.

Hoje finalizaremos o jogo com o jogador quebrando a última pedra.

Parte 1Parte 2Parte 3 – Parte 4

No último tutorial nós implementamos a identificação da pedra da base e o processo de quebra dela. Foi preciso identificá-la para saber qual pedra o jogador precisava clicar para quebrar. Além disso, implementamos a quebra da pedra da base. Essa quebra envolve um conjunto de ações, como a invisibilidade da pedra recém-quebrada e a animação da queda das pedras empilhadas logo acima.

No tutorial de hoje implementaremos um cronômetro que marca o tempo que o jogador está utilizando para quebrar toda a pilha de pedras. Então quando o jogador quebrar a última pedra, o cronômetro deverá ser parado e mostrar uma mensagem de término do jogo. Bora!?

 

Implementação do Cronômetro

Será incluso um cronômetro crescente que marcará o tempo que o jogador está utilizando para acabar com a pilha de pedras. Esse cronômetro ficará na parte central superior da tela do aparelho e será iniciado logo que o jogo iniciar. Como é necessário mostrar apenas valores numéricos ao jogador, podemos implementar o cronômetro com uma etiqueta simples. Essa será a primeira funcionalidade implementada no tutorial de hoje.

Como o cronômetro é modificado a todo momento, ou seja, a cada novo quadro mostrado ao jogador, então é necessário criar uma variável na classe “HelloWorld”. Como dito, essa variável corresponde a uma etiqueta. Assim, abra o arquivo “HelloWorldScene.h” e adicione a seguinte linha de código:

cocos2d::Label* cronometro;

logo abaixo dessa:

cocos2d::EventListenerTouchOneByOne* toqueNaTela;

Além disso, precisamos atualizar o valor apresentado no cronômetro a cada novo quadro processado. Essa atualização será realizada por um método nomeado “atualizaCronometro”. O protótipo desse método também precisa ser adicionado na classe “HelloWorld”. Dessa forma, no mesmo arquivo, adicione a seguinte linha de código:

void atualizaCronometro(float dt);

logo abaixo dessa:

void onTouchEnded(cocos2d::Touch *touch,cocos2d::Event *unused_event);

Salve esse arquivo, pois já realizamos todas as modificações necessárias nele. Agora vamos instanciar a etiqueta, posicioná-la, adicioná-la na tela e implementar o método “atualizaCronometro”. Abra o arquivo “HelloWorldScene.cpp” e adicione as seguintes linhas de código:

HelloWorld::cronometro = Label::createWithTTF(“0.000″,”fonts/Marker Felt.ttf”,60);

HelloWorld::cronometro->setAnchorPoint(Vec2(0.5,1.0));

HelloWorld::cronometro->setPosition(Vec2(visibleSize.width/2,visibleSize.height));

addChild(HelloWorld::cronometro);

schedule(schedule_selector(HelloWorld::atualizaCronometro));

logo abaixo dessa:

getEventDispatcher()->addEventListenerWithSceneGraphPriority(HelloWorld::toqueNaTela,this);

Para finalizar a implementação do cronômetro, basta implementar o método “atualizaCronometro”. Adicione as seguintes linhas de código no final do arquivo:

void HelloWorld::atualizaCronometro(float dt) {

    static float tempo = 0.0;

    char txt[8];

    tempo += dt;

    sprintf(txt,”%.3f”,tempo);

    HelloWorld::cronometro->setString(txt);

}

Com isso, implementamos o cronômetro. Note que ele é iniciado com o texto “0.000” e posicionado na parte superior e central da tela. Além disso, programamos a execução do método “atualizaCronometro” a cada novo quadro processado. Isso faz com que o cronômetro mostre o tempo decorrido desde a abertura do aplicativo.

Agora vamos implementar a finalização do jogo.

 

Término do Jogo

A finalização do jogo será bastante simples de implementar. Esse jogo finaliza quando o jogador quebra a última pedra existente. Isso acontece quando o jogador dá o quarto clique sobre a pedra da base da pilha de pedras. Na lógica da implementação, isso acontece quando o valor da variável “cliques” é igual a 5 e quando o valor da variável “blocoBase” é igual a 9.

Quando o jogo acabar, precisaremos desativar o sensor de toques na tela, parar o cronômetro, deixar a pedra da base invisível e adicionar uma etiqueta no centro da tela informando o término do jogo. Para isso, precisaremos modificar uma linha de código implementada no tutorial passado e adicionar as linhas de código que implementam as rotinas supracitadas. Então, modifique a seguinte linha de código:

else {

de forma que ela fique assim:

else if(blocoBase<9) {

Por último, adicione a seguinte linha de código:

Size size = Director::getInstance()->getVisibleSize();

logo abaixo dessa:

p.y = Director::getInstance()->getVisibleSize().height – p.y;

e adicione as seguintes linhas de código:

else {

    HelloWorld::toqueNaTela->setEnabled(false);

    unschedule(schedule_selector(HelloWorld::atualizaCronometro));

    HelloWorld::blocos[blocoBase]->setVisible(false);

    Label* fimDeJogo = Label::createWithTTF(“Fim de Jogo”,”fonts/Marker Felt.ttf”,120);

    fimDeJogo->setPosition(Vec2(size.width/2,size.height/2));

    addChild(fimDeJogo);

}

logo abaixo dessas:

        HelloWorld::blocos[i]->runAction(anim);

    }

}

Com isso, nós finalizamos o tutorial de hoje. Compile o código e execute o jogo. Note que o cronômetro é iniciado logo que o jogo é aberto e que o jogo é finalizado quando o jogador quebra a última pedra. O resultado pode ser visualizado no vídeo a seguir.

 

Hoje finalizamos a implementação de um jogo ao estilo Pokey Pummel. Primeiramente, nós implementamos um cronômetro crescente que é iniciado logo que o jogo é aberto. Logo após, nós identificamos quando a última pedra é quebrada e implementamos as rotinas de término de jogo. As rotinas são: deixar a última pedra invisível, desativar a tela de toque, parar o cronômetro e mostrar uma mensagem de término de jogo.

No próximo tutorial nós iniciaremos a implementação de mais um jogo.

Um grande abraço. []

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 *