Tutorial: Desenvolvendo um jogo ao estilo Mole Hunting – Parte 3: Martelando as toupeiras

As toupeiras já estão mostrando suas caras.

Porém ainda não podemos fazer nada. =/

Vamos criar a nossa primeira versão jogável.

Vimos no tutorial passado como fazer as toupeiras saírem dos buracos e se esconderem logo em seguida. Nós programamos um método que escolhe aleatoriamente uma toupeira para sair e espera um tempo aleatório para a próxima toupeira sair. Nesse tutorial, nós adicionaremos a próxima funcionalidade do jogo: a martelada. Com ela, poderemos bater na cabeça das toupeiras malditas.

Vamos começar o tutorial editando o arquivo “HelloWorldScene.h”. Adicione as seguintes linhas de código:

bool podeBater[6];

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

logo abaixo dessa:

cocos2d::CCSprite* toupeiras[6];

Note que, no código adicionado, nós declaramos um vetor de variáveis lógicas e o método “ccTouchesBegan”, que é chamado quando o jogador encosta o dedo na tela. O vetor de variáveis lógicas existe para verificar se a toupeira que está sendo martelada no momento já não foi acertada anteriormente. Resumindo, ele evita que ocorra dupla martelada. Salve o arquivo “HelloWorldScene.h”.

Agora abra o arquivo “HelloWorldScene.cpp” e adicione a seguinte linha de código:

HelloWorld::podeBater[i] = false;

logo abaixo dessas:

HelloWorld::toupeiras[i]->setPosition(ccp(

  ((i%3+1)/4.0)*size.width,((i/3+1)/3.0)*size.height));

Como todas as toupeiras iniciam embaixo da terra, então não existe nenhuma possibilidade de bater na cabeça delas, ainda. Dessa forma, adicionamos essa linha de código para que o vetor criado anteriormente seja inicializado com o valor negativo para todas as toupeiras. Agora adicione a seguinte linha de código:

setTouchEnabled(true);

logo ACIMA dessa:

schedule(schedule_selector(HelloWorld::sobeToupeira),5.0);

Acabamos de acionar a tela de toque. Ela deverá estar ligada para que possamos bater com a marreta na cabeça das toupeiras. Continuando, adicione a seguinte linha de código:

HelloWorld::podeBater[i] = true;

logo abaixo dessa:

schedule(schedule_selector(HelloWorld::sobeToupeira),((float)r)/RAND_MAX);

Nessa última adição, nós fazemos com que o jogador possa bater na cabeça de uma toupeira que está para sair do buraco. Como ela está para sair do buraco, então, obviamente, o jogador não bateu nela ainda. Assim, caso o jogador acerte uma toupeira em um buraco e, posteriormente, alguma outra toupeira volte a sair pelo mesmo buraco, essa nova toupeira poderá ser acertada também.

Agora basta implementar o método “ccTouchesBegan” para fazer uma toupeira ficar atordoada caso o jogador encoste o dedo sobre a cabeça dela. Adicione as seguintes linhas de código no final do arquivo:

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

    int i;

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

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

    for(i=0;i<6;i++)

        if(HelloWorld::toupeiras[i]->boundingBox().containsPoint(ponto)&&HelloWorld::podeBater[i])

            if(HelloWorld::toupeiras[i]->isFrameDisplayed(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira2.png”))||

              HelloWorld::toupeiras[i]->isFrameDisplayed(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira3.png”))||

              HelloWorld::toupeiras[i]->isFrameDisplayed(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira4.png”))||

              HelloWorld::toupeiras[i]->isFrameDisplayed(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira5.png”))) {

                HelloWorld::podeBater[i] = false;

                CCArray *seq = CCArray::create();

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira6.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira7.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira8.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira6.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira7.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira8.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira6.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira7.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira8.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira5.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira4.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira3.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira2.png”));

                seq->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“Toupeira1.png”));

                HelloWorld::toupeiras[i]->cleanup();

                HelloWorld::toupeiras[i]->runAction(CCAnimate::create(CCAnimation::createWithSpriteFrames(seq,0.1)));

            }

}

Perceba que, primeiramente, identificamos qual toupeira o jogador tentou bater. Caso o jogador possa bater na cabeça dela e ela esteja durante a animação de sair e entrar no buraco, então o sprite sofre a animação de toupeira atordoada e de se esconder novamente no buraco. Perceba que, caso o jogador bata na cabeça da toupeira, a célula do vetor de variáveis lógicas referente à toupeira martelada é igualada a falso, impossibilitando o jogador de bater novamente na mesma toupeira. Compile o código e execute o jogo. Note que agora temos uma versão jogável. A Figura 1 mostra uma toupeira acertada por uma marretada.

Figura 1 - Toupeira atordoada

Figura 1 – Toupeira atordoada

Vimos nesse tutorial como adicionar a funcionalidade que deixa jogável o nosso game ao estilo mole hunting.

Precisamos adicionar um vetor que identifica se as toupeiras estão fora do buraco, prontas para serem acertadas pelo jogador. Caso o jogador acerte uma toupeira pela primeira vez, é iniciada uma animação que a deixa atordoada e o vetor é modificado de forma que ela não possa ser acertada repetidamente.

Adicionaremos, no próximo tutorial, os elementos de HUD do jogo e o término dele.

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