Tutorial: Desenvolvendo um Jogo de Labirinto – Parte 3: Contagem de Passos e Término do Jogo

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;

Figura 1 - Jogo executando
Figura 1 – Jogo executando

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

Santiago Viertel

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.

Send this to a friend