Finalizamos mais um conjunto de tutoriais.
Implementaremos a contagem do número de passos que o jogador deu e os procedimentos de término do jogo.
Go go go …
Implementamos no último tutorial a movimentação do personagem no labirinto. Primeiramente, identificamos a localização que o jogador encosta o dedo na tela e, em seguida, movemos o personagem na direção desejada.
Hoje implementaremos as únicas funcionalidades que faltam no nosso jogo de labirinto. A contagem de passos, que define o desempenho do jogador em finalizar o jogo, e o término do jogo quando o jogador alcançar a célula objetivo (amarela).
Vamos começar.
Contagem de Passos
Antes de pensarmos em contar o número de passos que o jogador deu durante o jogo, precisamos nos preocupar em como apresentaremos essa informação a ele. Nesse contexto, existirá uma etiqueta na parte superior da tela. Essa etiqueta será modificada sempre que o jogador realizar uma movimentação no personagem. Dessa forma, precisamos declará-la como atributo da classe “HelloWorld”. Assim, abra o arquivo “HelloWorldScene.h” e adicione a seguinte linha de código:
cocos2d::Label* movimentacoes;
logo abaixo dessa:
cocos2d::EventListenerTouchOneByOne* toqueNaTela;
Salve e feche esse arquivo, pois já realizamos todas as modificações necessárias. Vamos começar posicionando o personagem sobre a célula de início de jogo. Abra o arquivo “HelloWorldScene.cpp” e modifique a seguinte linha de código:
Sprite* tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileAt(Vec2(4,1));
de forma que ela fique assim:
Sprite* tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileAt(Vec2(0,1));
Agora vamos instanciar e posicionar a etiqueta que apresenta ao jogador a quantidade de passos que ele já realizou até o momento. Adicione as seguintes linhas de código:
HelloWorld::movimentacoes = Label::createWithTTF(“Movimentacoes: 0″,”fonts/Marker Felt.ttf”,80);
HelloWorld::movimentacoes->setAnchorPoint(Vec2(0.5,1.0));
HelloWorld::movimentacoes->setPosition(visibleSize.width/2,visibleSize.height);
addChild(HelloWorld::movimentacoes);
logo abaixo dessa:
getEventDispatcher()->addEventListenerWithSceneGraphPriority(HelloWorld::toqueNaTela,this);
Adicionada a etiqueta, agora precisamos modificá-la sempre quando o jogador realiza uma movimentação no personagem. Essa movimentação pode ser feita para cima, para baixo, para a esquerda ou para a direita. Para adicionar um passo quando o jogador clica a direita do personagem, adicione as seguintes linhas de código:
cont++;
sprintf(txt,”Movimentacoes: %i”,cont);
HelloWorld::movimentacoes->setString(txt);
logo abaixo dessas:
tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileAt(Vec2(i+1,j));
HelloWorld::personagem->setPosition(Vec2(
tile->getPositionX() + tile->getBoundingBox().size.width/2,
tile->getPositionY() + tile->getBoundingBox().size.height/2));
Para adicionar um passo quando o jogador clica acima do personagem, adicione as seguintes linhas de código:
cont++;
sprintf(txt,”Movimentacoes: %i”,cont);
HelloWorld::movimentacoes->setString(txt);
logo abaixo dessas:
tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->
getTileAt(Vec2(i,j-1));
HelloWorld::personagem->setPosition(Vec2(
tile->getPositionX() + tile->getBoundingBox().size.width/2,
tile->getPositionY() + tile->getBoundingBox().size.height/2));
Para adicionar um passo quando o jogador clica abaixo do personagem, adicione as seguintes linhas de código:
cont++;
sprintf(txt,”Movimentacoes: %i”,cont);
HelloWorld::movimentacoes->setString(txt);
logo abaixo dessas:
tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->
getTileAt(Vec2(i,j+1));
HelloWorld::personagem->setPosition(Vec2(
tile->getPositionX() + tile->getBoundingBox().size.width/2,
tile->getPositionY() + tile->getBoundingBox().size.height/2));
Para adicionar um passo quando o jogador clica a esquerda do personagem, adicione as seguintes linhas de código:
cont++;
sprintf(txt,”Movimentacoes: %i”,cont);
HelloWorld::movimentacoes->setString(txt);
logo abaixo dessas:
tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileAt(Vec2(i-1,j));
HelloWorld::personagem->setPosition(Vec2(
tile->getPositionX() + tile->getBoundingBox().size.width/2,
tile->getPositionY() + tile->getBoundingBox().size.height/2));
Notem que houve repetição de código mas é algo fácil de entender. Em todos os casos nós apenas adicionamos a quantidade de movimentações realizadas pelo jogador em uma unidade e editamos a etiqueta informativa. Porém, ainda precisamos declarar as variáveis “cont” e “txt”. Para isso, adicione as seguintes linhas de código:
char txt[20];
static int cont = 0;
logo abaixo dessa:
float angulo;
Com isso, nós finalizamos a implementação da contagem do número de passos dados pelo jogador no decorrer do jogo.
Término do Jogo
Para finalizar o jogo, basta verificarmos a cada passo do jogador se o personagem se moveu para a célula destino. Caso isso aconteça, nós apresentamos ao jogador uma etiqueta informando que o jogo foi finalizado. Nada muito complicado. Porém, assim como no item anterior, precisamos realizar essa checagem em cada uma das possíveis movimentações que o personagem pode tomar. Para verificar se o jogador caiu sobre a célula destino quando ele mover o personagem para a direita, adicione as seguintes linhas de código:
if(HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileGIDAt(Vec2(i+1,j))==3) {
Label* fimDeJogo = Label::createWithTTF(“Fim de Jogo”,”fonts/Marker Felt.ttf”,100);
fimDeJogo->setTextColor(Color4B::BLUE);
fimDeJogo->setAnchorPoint(Vec2(0.5,0.0));
fimDeJogo->setPosition(size.width/2,size.height/2);
addChild(fimDeJogo);
HelloWorld::movimentacoes->setPosition(size.width/2,size.height/2);
HelloWorld::movimentacoes->setTextColor(Color4B::BLUE);
HelloWorld::toqueNaTela->setEnabled(false);
}
logo abaixo dessas:
tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileAt(Vec2(i+1,j));
HelloWorld::personagem->setPosition(Vec2(
tile->getPositionX() + tile->getBoundingBox().size.width/2,
tile->getPositionY() + tile->getBoundingBox().size.height/2));
cont++;
sprintf(txt,”Movimentacoes: %i”,cont);
HelloWorld::movimentacoes->setString(txt);
Para verificar se o jogador caiu sobre a célula destino quando ele mover o personagem para cima, adicione as seguintes linhas de código:
if(HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileGIDAt(Vec2(i,j-1))==3) {
Label* fimDeJogo = Label::createWithTTF(“Fim de Jogo”,”fonts/Marker Felt.ttf”,100);
fimDeJogo->setTextColor(Color4B::BLUE);
fimDeJogo->setAnchorPoint(Vec2(0.5,0.0));
fimDeJogo->setPosition(size.width/2,size.height/2);
addChild(fimDeJogo);
HelloWorld::movimentacoes->setPosition(size.width/2,size.height/2);
HelloWorld::movimentacoes->setTextColor(Color4B::BLUE);
HelloWorld::toqueNaTela->setEnabled(false);
}
logo abaixo dessas:
tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->
getTileAt(Vec2(i,j-1));
HelloWorld::personagem->setPosition(Vec2(
tile->getPositionX() + tile->getBoundingBox().size.width/2,
tile->getPositionY() + tile->getBoundingBox().size.height/2));
cont++;
sprintf(txt,”Movimentacoes: %i”,cont);
HelloWorld::movimentacoes->setString(txt);
Para verificar se o jogador caiu sobre a célula destino quando ele mover o personagem para baixo, adicione as seguintes linhas de código:
if(HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileGIDAt(Vec2(i,j+1))==3) {
Label* fimDeJogo = Label::createWithTTF(“Fim de Jogo”,”fonts/Marker Felt.ttf”,100);
fimDeJogo->setTextColor(Color4B::BLUE);
fimDeJogo->setAnchorPoint(Vec2(0.5,0.0));
fimDeJogo->setPosition(size.width/2,size.height/2);
addChild(fimDeJogo);
HelloWorld::movimentacoes->setPosition(size.width/2,size.height/2);
HelloWorld::movimentacoes->setTextColor(Color4B::BLUE);
HelloWorld::toqueNaTela->setEnabled(false);
}
logo abaixo dessas:
tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->
getTileAt(Vec2(i,j+1));
HelloWorld::personagem->setPosition(Vec2(
tile->getPositionX() + tile->getBoundingBox().size.width/2,
tile->getPositionY() + tile->getBoundingBox().size.height/2));
cont++;
sprintf(txt,”Movimentacoes: %i”,cont);
HelloWorld::movimentacoes->setString(txt);
Para verificar se o jogador caiu sobre a célula destino quando ele mover o personagem para a esquerda, adicione as seguintes linhas de código:
if(HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileGIDAt(Vec2(i-1,j))==3) {
Label* fimDeJogo = Label::createWithTTF(“Fim de Jogo”,”fonts/Marker Felt.ttf”,100);
fimDeJogo->setTextColor(Color4B::BLUE);
fimDeJogo->setAnchorPoint(Vec2(0.5,0.0));
fimDeJogo->setPosition(size.width/2,size.height/2);
addChild(fimDeJogo);
HelloWorld::movimentacoes->setPosition(size.width/2,size.height/2);
HelloWorld::movimentacoes->setTextColor(Color4B::BLUE);
HelloWorld::toqueNaTela->setEnabled(false);
}
logo abaixo dessas:
tile = HelloWorld::labirinto->getLayer(“Camada de Tiles 1”)->getTileAt(Vec2(i-1,j));
HelloWorld::personagem->setPosition(Vec2(
tile->getPositionX() + tile->getBoundingBox().size.width/2,
tile->getPositionY() + tile->getBoundingBox().size.height/2));
cont++;
sprintf(txt,”Movimentacoes: %i”,cont);
HelloWorld::movimentacoes->setString(txt);
Para finalizar, adicione a seguinte linha de código:
Size size = Director::getInstance()->getVisibleSize();
logo abaixo dessa:
static int cont = 0;

Salve o arquivo, compile o código e execute o jogo. Perceba que quando o personagem se movimenta uma célula, o contador passos é incrementado em uma unidade. Além disso, quando o personagem alcança a célula destino, o jogo é finalizado, mostrando ao jogador uma mensagem de término, uma mensagem da quantidade de passos executados e desabilitando o toque na tela. Para os curiosos de plantão, segue um vídeo do jogo executando. A Figura ilustra um término de jogo.
Terminamos de implementar mais um conjunto de tutoriais que resulta em um jogo. Dessa vez, nós implementamos um jogo de labirinto com a mecânica clássica. Finalizamos o conjunto de tutoriais com a implementação da contagem de passos e do término do jogo.
No próximo tutorial nós iniciaremos a implementação de outro jogo.
Um grande abraço e até mais. []
One thought on “Tutorial: Desenvolvendo um Jogo de Labirinto – Parte 3: Contagem de Passos e Término do Jogo”