full screen background image

Desenvolvendo um Jogo Digital do Zero: Parte 14 – Implementação do power up

Desenvolvendo um Jogo Digital do Zero: Parte 14 – Implementação do power up

Até o momento, já implementamos as principais funcionalidades do Shark Pong.

Porém, ainda existe na tela do principal do gameplay um polvo fora da água.

Então, daremos continuidade à implementação do jogo adicionando a funcionalidade do power up do polvo.

Todas as partes da saga:

http://fabricadejogos.net/colunas/producao-jogo-digital-do-zero

lula-moluscoVimos no artigo passado a implementação da máquina de estados que rege as escolhas do NPC. O jogador, movido pelo computador, possui três estados diferentes: o primeiro em que ele fica parado, o segundo em que ele toma uma direção aleatória e o terceiro em que ele fica na mesma altura do tubarão. Também codificamos de forma que essas escolhas sejam feitas de maneira aleatória, fazendo com que o NPC nunca realize movimentações perfeitas.

Veremos nesse artigo a programação do power up do polvo. Faremos com que ele apareça e desapareça temporariamente, assim como implementaremos o efeito que ele causa ao jogador oponente caso o tubarão o alcance. Mas, antes de tudo, realizaremos a correção de alguns erros que ainda persistem (isso é normal, acreditem). =]

 

Apertando os parafusos

ParafusoApertar os parafusos é um termo bastante utilizado por nós desenvolvedores. Normalmente, os programadores ficam mais preocupados no funcionamento lógico do jogo. Assim, às vezes, é necessário realizar alguns ajustes com o objetivo de deixar o jogo mais dinâmico, ou até mais devagar, se for o caso. Conversando com o game designer do Shark Pong, o Fabiano, vimos que precisávamos realizar alguns ajustes para que o jogo se mantenha desafiador.

Duas mudanças precisaram ser realizadas na última versão do jogo. A primeira consiste no reposicionamento dos surfistas na tela. Na versão atual, o surfista que o jogador comanda é iniciado numa parte mais superior da tela e o surfista do NPC é iniciado numa parte mais inferior. Para que o jogo fique padrão, faremos com que ambos os surfistas iniciem exatamente no centro da tela. Para isso, abra o arquivo “HelloWorldScene.cpp” e modifique a seguinte linha de código:

HelloWorld::paJogador->setPosition(ccp(0.1*size.width,0.9*size.height));

de forma que ela fique assim:

HelloWorld::paJogador->setPosition(ccp(0.1*size.width,size.height/2));

e a seguinte linha de código:

HelloWorld::paIA->setPosition(ccp(0.9*size.width,0.3*size.height));

de forma que ela fique assim:

HelloWorld::paIA->setPosition(ccp(0.9*size.width,size.height/2));


Por último, vamos apertar os parafusos referente à velocidade do tubarão. Achamos que ele andava muito devagar. Isso deixa o jogo pouco dinâmico e chato. Para aumentar a velocidade inicial do tubarão, no mesmo arquivo editado anteriormente, modifique a seguinte linha de código:

HelloWorld::velocidadeTubarao = 0.2*size.width;

de forma que ela fique assim:

HelloWorld::velocidadeTubarao = 0.4*size.width;

Além disso, faremos também com que o tubarão aumente um pouco mais a sua velocidade com o tempo. Para isso, modifique a seguinte linha de código:

HelloWorld::velocidadeTubarao += 0.1*0.2*size.width;

de forma que ela fique assim:

HelloWorld::velocidadeTubarao += 0.1*0.4*size.width;

Assim, faremos o jogo inicializar com os surfistas centralizados na tela e fizemos com que o tubarão se movimente mais rápido em relação à última versão do jogo.

 

Fazendo o polvo aparecer e desaparecer

mergulhoAgora que implementaremos as funcionalidades propostas no artigo. Antes de tudo, adicione na classe “HelloWorld” os protótipos dos métodos que programaremos hoje. Abra o arquivo “HelloWorldScene.h” e adicione as seguintes linhas de código:

void aparecePolvo();

void desaparecePolvo();

void habilitaJogador();

void desabilitaJogador();

void habilitaNPC();

void desabilitaNPC();

logo abaixo dessa:

float posicaoInicialTubarao[2];

Cada um desses métodos será explicado no decorrer do artigo. Vamos iniciar com a implementação dos métodos “aparecePolvo” e “desaparecePolvo”. Tais métodos realizarão o aparecimento e desaparecimento do polvo em algum lugar da tela. Abra o arquivo “HelloWorldScene.cpp” e adicione as seguintes linhas de código no final do arquivo:

void HelloWorld::aparecePolvo() {

    static unsigned int r = time(NULL);

    CCSize size = CCDirector::sharedDirector()->getWinSize();

    CCPoint p;

    srand(r);

    r = rand();

    p.x = 0.2*size.width + (((float)r)/RAND_MAX)*(0.6*size.width);

    srand(r);

    r = rand();

    p.y = 0.4*size.height + (((float)r)/RAND_MAX)/(0.4*size.height);

    HelloWorld::polvo->setPosition(p);

    HelloWorld::polvo->setVisible(true);

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

    unschedule(schedule_selector(HelloWorld::aparecePolvo));

}

void HelloWorld::desaparecePolvo() {

    static unsigned int r = time(NULL);

    float tempo;

    srand(r);

    r = rand();

    tempo = 5.0 + (((float)r)/RAND_MAX)*10.0;

    HelloWorld::polvo->setVisible(false);

    schedule(schedule_selector(HelloWorld::aparecePolvo),tempo);

    unschedule(schedule_selector(HelloWorld::desaparecePolvo));

}

krakenNo método “aparecePolvo”, nós sorteamos dois números aleatórios que definem a posição onde o polvo aparecerá, posicionamos o polvo no lugar sorteado, fazemos o polvo aparecer na tela e programamos a execução do método “desaparecePolvo” após cinco segundos. Isso significa que o polvo ficará por no máximo cinco segundos na tela. No método “desaparecePolvo”, primeiramente, é sorteado um número aleatório que varia entre cinco e dez, depois o polvo é deixado como invisível e, por último, é programado para que o método “aparecePolvo” seja executado após o término do tempo sorteado. A programação de ambos os métodos fará com que o polvo apareça após um tempo que varia entre cinco e dez segundos e desapareça após cinco segundos.

Para que isso seja posto em execução, é necessário chamar o método “aparecePolvo” logo na inicialização do jogo. Dessa forma, adicione a seguinte linha de código:

HelloWorld::aparecePolvo();

logo abaixo dessa:

HelloWorld::tomaDecisaoNPC();

Com isso, acabamos de fazer com que o polvo apareça e desapareça da tela em tempos aleatórios e em lugares também aleatórios. Agora, falta aplicar os efeitos do power up do polvo.

 

Aplicando os efeitos

surfistaAgora só falta fazer com que os surfistas fiquem parados caso o tubarão bata no polvo. Primeiramente, implementaremos os quatro métodos restantes que aplicam o efeito ou no surfista controlado pelo jogador, ou no surfista controlado pela máquina. Adicione as seguintes linhas de código no final do arquivo:

void HelloWorld::habilitaJogador() {

    static unsigned int r = time(NULL);

    float tempo;

    srand(r);

    r = rand();

    tempo = 5.0 + (((float)r)/RAND_MAX)*10.0;

    setTouchEnabled(true);

    schedule(schedule_selector(HelloWorld::aparecePolvo),tempo);

    unschedule(schedule_selector(HelloWorld::habilitaJogador));

}

void HelloWorld::desabilitaJogador() {

    HelloWorld::polvo->setVisible(false);

    HelloWorld::paJogador->cleanup();

    setTouchEnabled(false);

    schedule(schedule_selector(HelloWorld::habilitaJogador),1.0);

    unschedule(schedule_selector(HelloWorld::desaparecePolvo));

}

void HelloWorld::habilitaNPC() {

    static unsigned int r = time(NULL);

    float tempo;

    srand(r);

    r = rand();

    tempo = 5.0 + (((float)r)/RAND_MAX)*10.0;

    HelloWorld::tomaDecisaoNPC();

    schedule(schedule_selector(HelloWorld::aparecePolvo),tempo);

    unschedule(schedule_selector(HelloWorld::habilitaNPC));

}

void HelloWorld::desabilitaNPC() {

    HelloWorld::polvo->setVisible(false);

    HelloWorld::paIA->cleanup();

    schedule(schedule_selector(HelloWorld::habilitaNPC),1.0);

    unschedule(schedule_selector(HelloWorld::desaparecePolvo));

}

Note que foram adicionados quatro métodos: “habilitaJogador”, “desabilitaJogador”, “habilitaNPC” e “desabilitaNPC”. É possível ter uma ideia do que cada um deles faz pelos seus próprios nomes. Como o efeito é iniciado em certos momentos e finalizado após um tempo, faz-se necessária existência de um método para o início e um para o fim do efeito. Além disso, o efeito pode acontecer tanto no surfista controlado pelo jogador como no surfista controlado pelo NPC.

O método “desabilitaJogador”, faz o polvo ficar invisível e desliga a tela de toque. Isso faz com que o jogador fique impossibilitado de jogar por um período de tempo. Além disso, é programada a execução do método “habilitaJogador” após o tempo de um segundo. No método “habilitaJogador”, é sorteado um valor aleatório que determinará o tempo que o próximo polvo aparecerá e é realizado o acionamento da tela de toque. Esses dois métodos realizam a aplicação e término do efeito no surfista controlado pelo jogador.

RoboO método “desabilitaNPC”, além de deixar o polvo invisível, também remove qualquer programação de execução do método “tomaDecisaoNPC”. Caso você não lembre, esse método é responsável por fazer com que o NPC realize alguma movimentação. Após fazer com que o NPC não tome mais decisões, esse método programa a execução do método “habilitaNPC” após o tempo de um segundo. Por último, o método “habilitaNPC” inicializa a execução em cadeia do método “tomaDecisaoNPC”, o que faz com que o surfista controlado pelo computador volte a jogar contra o jogador. Tudo é finalizado com a programação da execução do método “aparecePolvo” após um tempo aleatório que varia entre cinco e dez segundos.

Por último, e não menos importante, faremos com que o efeito do power up seja aplicado no momento em que o tubarão passa por cima do polvo. Para isso, adicione as seguintes linhas de código no final do método “atualizaQuadro”:

if(HelloWorld::polvo->isVisible()&&HelloWorld::tubarao->boundingBox().intersectsRect(HelloWorld::polvo->boundingBox()))

    if(HelloWorld::vetorDirecaoTubarao[0]<0)

        HelloWorld::desabilitaJogador();

    else

        HelloWorld::desabilitaNPC();

Apenas adicionamos o tratamento de colisão entre o tubarão e o polvo. Quando o polvo está visível na tela, é verificado, a cada quadro, se o tubarão encostou no polvo. Caso isso aconteça, é verificado se o tubarão está andando para a esquerda ou para a direita. Caso ele esteja andando para a esquerda, então o surfista do jogador é parado com a execução do método “desabilitaJogador”. Caso contrário é executado o método “desabilitaNPC”. Se você compilar o código e executar o jogo perceberá que o power up do polvo está funcionando. O resultado é algo como o que é mostrado na animação a seguir, onde o jogador é paralisado por um curto período de tempo.

JogoExecutado

Implementamos nesse artigo o sistema do power up do polvo. Vimos que precisávamos implementar quatro métodos diferentes. Cada um desses métodos ou implementava o início ou o final do efeito do power up, que poderia acontecer no surfista do computador ou no surfista do NPC. Além disso, apertamos alguns parafusos para deixar o jogo mais dinâmico.

O próximo artigo será o último referente à programação do jogo. Finalizaremos com a implementação do término do jogo, inclusão dos elementos de HUD e a programação de algumas animações realizadas pelo Filipe (nos artigos sobre arte) para deixar o jogo mais bonito.

Um grande abraço e até mais. []



Santiago Viertel

Formado em Bacharelado em Ciência da Computação (UDESC), mestre e doutorando em Análise de Algoritmos (UFPR). Atualmente é programador da Céu Games (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.


Show Buttons
Hide Buttons