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 1 – Parte 2 – Parte 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. []