Tutorial: Desenvolvimento de Jogos para Android com Cocos2d-x – Parte 6

Depois de vermos como incluir elementos na tela, precisamos saber como colocar botões. Não apenas botões, mas como eu faço o jogo modificar algo quando eu encosto o dedo na tela toque. Vamos aprender a interagir com o jogo por meio da tela de toque.

No tutorial passado nós vimos como criar uma camada de HUD no Cocos2d-x. Para isso foi necessário entendermos bem como o motor gráfico gerencia árvore de objetos. Vimos também que se usarmos bem essa árvore de objetos, nós podemos fazer o jogo modificar o mundo sem que seja mudado de lugar qualquer elemento de HUD.

Nesse tutorial eu mostrarei outro ponto muito importante sobre jogos: a interação com a tela de toque. A princípio eu mostraria botões e HUDs, mas eu achei melhor dividir o tutorial em interação com a tela de toque e, posteriormente, apresentar o botão de interação. Bora mexer e interagir com os elementos na tela?

 

 

Classes no C++ e conceito de Herança

Então pessoal, pelo que vimos até então, estamos lidando com uma linguagem de programação orientada a objetos. Não é à toa que lidamos com árvore de objetos no tutorial passado. Um dos conceitos importantes que ainda não vimos sobre orientação a objetos é o de Herança.

Explicando brevemente, herança provê a instância de objetos que compartilham atributos (características) e métodos (ações). Como assim? Suponha que eu tenha um veículo que é movido por rodas e é capaz de andar. Dessa forma, eu tenho uma classe chamada “Veículo” que possui como atributo “número de rodas” e um método “andar”. Logo após, eu preciso criar uma outra classe chamada “Carro”. Sabemos que “Carro” também possui rodas e também pode andar. Dessa forma, eu posso criar a classe “Carro” herdando os atributos e métodos da classe “Veículo”. Se eu criar a classe “Carro” com um atributo “tamanho do motor”, por exemplo, e herdar a classe “Veículo”, nós teremos um veículo motorizado. Logo após, na classe “Carro”, teremos o método “andar” e os atributos “tamanho do motor” e “número de rodas”. A Figura 1 mostra graficamente a explicação dada.

Figura 1 - Aplicação do conceito de herança

Figura 1 – Aplicação do conceito de herança

Na figura e na explicação, eu citei a criação de uma classe “Carro” e de uma classe “Veículo”. Com essas classes eu posso montar vários carros diferentes, com diferentes tamanhos de motores e número de rodas (estranho, né? Hehe). Quando eu crio um carro específico, eu estou criando um objeto. Vale deixar clara a diferença entre classe e objeto, sendo a primeira uma espécie de forma, e o segundo uma espécie de bolo que se cria com a forma. Ligou?

 

Identificando toques na tela

Falei sobre os conceitos de herança, classe e objeto. Agora vamos aplicar isso para interagir com o nosso MegaMan (créditos da Capcom). Para você começar a entender tudo o que eu falei, no código, abra os arquivos “HelloWorldScene.h” e “HelloWorldScene.cpp” no Eclipse. Relembrando que estou tomando como base o código modificado no final do último tutorial. No arquivo “HelloWorldScene.h”, nessa parte do código:

class HelloWorld : public cocos2d::CCLayer

nós estamos criando uma nova classe chamada “HelloWorld” que herda todos os atributos e métodos da classe “CCLayer”. A classe “CCLayer” é uma já existente no próprio motor do Cocos2d-x. Dessa forma, “HelloWorld” é também uma classe “CCLayer”. Na classe “CCLayer” temos três métodos importantes para gerenciar toques na tela: ccTouchesBegan, ccTouchesMoved e ccTouchesEnded. Vamos usar somente o ccTouchesEnded.

Evitando delongas, copie e cole o código a seguir no final do arquivo “HelloWorldScene.cpp”.

void HelloWorld::ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent) {

    CCPoint p = (static_cast<CCTouch*>(pTouches->anyObject()))->getLocationInView();

    p.y = CCDirector::sharedDirector()->getWinSize().height – p.y;

    getChildByTag(1)->setPosition(p);

}

Logo após, no mesmo arquivo, inclua as seguintes linhas de código:

sprite->setTag(1);

setTouchEnabled(true);

logo abaixo dessa linha de código:

sprite->setPosition(ccp(size.width/2,size.height/2));

Ainda no mesmo arquivo, remova as linhas de código abaixo:

sprite->runAction(

    CCMoveBy::create(3,ccp(size.width/2 – sprite->boundingBox().size.width/2,0)));

Mudando para o arquivo “HelloWorldScene.h”, copie e cole a seguinte linha de código:

virtual void ccTouchesEnded(cocos2d::CCSet *pTouches,cocos2d::CCEvent *pEvent);

logo abaixo da linha de código:

CREATE_FUNC(HelloWorld);

Compile e execute o programa. Quando você clica na tela não acontece nada, mas quando você tira o seu dedo da tela, o sprite do MegaMan vai para o lugar onde você tirou o dedo. Isso acontece porque o método ccTouchesEnded é chamado somente quando um toque na tela é finalizado. Ou seja, se você for entender o código, dentro do método ccTouchesEnded, nós encontramos o sprite com “tag” igual a 1, que definimos anteriormente pelo método setTag, e o posicionamos no ponto onde o toque na tela acabou. A Figura 2 mostra o sprite do MegaMan posicionado onde foi encostado o dedo na tela.

Figura 2 - Jogo executando

Figura 2 – Jogo executando

Não chegamos a utilizar os métodos ccTouchesBegan nem o ccTouchesMoved, mas eu posso explicar quando se usa cada um. O ccTouchesBegan é chamado sempre que um novo toque é realizado na tela, enquanto o método ccTouchesMoved é chamado a cada momento que um toque sofre “arrasto” na tela. Simples, né?

Nesse tutorial eu mostrei como incluir nos nossos games interação por meio do toque na tela. Para isso eu expliquei alguns conceitos de orientação a objetos, como: o que é uma classe, um objeto e herança. Ao final, nós usamos o conceito de herança para podermos reconhecer toques na tela do celular. No próximo tutorial eu mostrarei como incluirmos botões de interação no nosso game e faremos o MegaMan andar na tela quando clicarmos nos botões.

Então é isso, leitores. Um grande agraço e nos encontramos mais além. =]

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.