Tutorial: Desenvolvendo um jogo de memorização de sinais: Parte 2 – Gerando e apresentando a sequência aleatória

Iniciamos o desenvolvimento de mais um jogo.

Já foi criado o projeto e já programamos a tela de gameplay.

Daremos continuidade implementando a criação e a apresentação da sequência de botões.

 

Parte 1 – Parte 2 – Parte 3Parte 4Parte 5

Vimos no último tutorial como funciona o mecanismo do jogo Genius (créditos a Estrela). Criamos e preparamos o projeto para a implementação e também implementamos a tela de gameplay. Não foram adicionadas, ainda, nenhuma animação e interação com o jogo.

Hoje, nós incluiremos as duas principais funcionalidades do nosso Genius. Implementaremos a escolha aleatória de um botão, quando a sequência precisa ser aumentada, e a apresentação da sequência ao jogador.

FuncionalidadePara implementarmos as duas funcionalidades propostas, precisaremos criar uma lista que armazena a sequência de botões que o jogador precisa apresentar e dois métodos que serão indispensáveis para o funcionamento do jogo. Um desses métodos será responsável por escolher aleatoriamente um botão para ser acrescentado na sequência; outro responsável por apresentar a sequência ao jogador.

Precisamos, então, declarar na classe “HelloWorld” um vetor que armazena a sequência aleatória e dois métodos. Abra o arquivo “HelloWorldScene.h” e adicione as seguintes linhas de código:

cocos2d::CCArray* sequencia;

void mostraSequencia();

void aumentaSequencia();

logo abaixo dessa:

cocos2d::CCSprite* lampDir;

O método “aumentaSequencia” será responsável por acrescentar um botão na sequência que o jogador precisa decorar. O método “mostraSequencia” será responsável por mostrar a sequência ao jogador e, por último, o vetor “sequencia” armazenará toda a sequência. Ela será armazenada por meio de um vetor de números inteiros. Esses valores vão variar de 0 a 3, sendo que cada número corresponde a um dos botões que deverão ser apertados pelo jogador para que ele apresente a sequência de sinais.

SequenciaVamos, primeiramente, instanciar o vetor para que possamos armazenar a sequência de botões. Abra o arquivo “HelloWorldScene.cpp” e adicione as seguintes linhas de código:

HelloWorld::sequencia = CCArray::create();

HelloWorld::sequencia->retain();

logo abaixo dessa:

addChild(HelloWorld::lampDir);

Agora que já podemos utilizar o vetor, vamos implementar os métodos que geram a sequência aleatoriamente e que mostra a sequência ao jogador. No final do mesmo arquivo, adicione as seguintes linhas de código:

void HelloWorld::mostraSequencia() {

    int i,v;

    CCDelayTime* dt = CCDelayTime::create(0.6);

    CCArray* frames = CCArray::create();

    frames->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“LuzAcesa.png”));

    frames->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(“LuzApagada.png”));

    CCAnimate* an = CCAnimate::create(CCAnimation::createWithSpriteFrames(frames,0.3));

    CCArray* seq1 = CCArray::create();

    CCArray* seq2 = CCArray::create();

    CCArray* seq3 = CCArray::create();

    CCArray* seq4 = CCArray::create();

    seq1->addObject(dt->copy());

    seq2->addObject(dt->copy());

    seq3->addObject(dt->copy());

    seq4->addObject(dt->copy());

    for(i=0;i<HelloWorld::sequencia->count();i++) {

        v = (static_cast<CCInteger*>(HelloWorld::sequencia->objectAtIndex(i)))->getValue();

        if(v==0) {

            seq1->addObject(an->copy());

            seq2->addObject(dt->copy());

            seq3->addObject(dt->copy());

            seq4->addObject(dt->copy());

        } else if(v==1) {

            seq1->addObject(dt->copy());

            seq2->addObject(an->copy());

            seq3->addObject(dt->copy());

            seq4->addObject(dt->copy());

        } else if(v==2) {

            seq1->addObject(dt->copy());

            seq2->addObject(dt->copy());

            seq3->addObject(an->copy());

            seq4->addObject(dt->copy());

        } else {

            seq1->addObject(dt->copy());

            seq2->addObject(dt->copy());

            seq3->addObject(dt->copy());

            seq4->addObject(an->copy());

        }

    }

    HelloWorld::lampSup->runAction(CCSequence::create(seq1));

    HelloWorld::lampInf->runAction(CCSequence::create(seq2));

    HelloWorld::lampEsq->runAction(CCSequence::create(seq3));

    HelloWorld::lampDir->runAction(CCSequence::create(seq4));

}

void HelloWorld::aumentaSequencia() {

    static int r = time(NULL);

    int escolha;

    srand(r);

    r = rand();

    escolha = r/(RAND_MAX/4);

    HelloWorld::sequencia->addObject(CCInteger::create(escolha));

}

AmpulhetaNo método “aumentaSequencia” nós sorteamos um valor aleatório que varia entre 0 e 3 e o adicionamos no vetor de sequência. No método “mostraSequencia”, nós criamos uma sequência de animações para cada lâmpada da tela de gameplay. Essas sequências de animações são compostas por tempos de espera e pelo acender e apagar da lâmpada. Assim, quando são iniciadas as animações das quatro lâmpadas ao mesmo tempo, elas piscarão em tempos pré-determinados conforme as sequências de animações criadas. Note que, quando uma animação de acender e apagar uma lâmpada é criada, também são criadas animações de tempo de espera para as outras lâmpadas. Isso fará com que cada lâmpada acenda somente quando as outras estão apagadas. Além disso, a escolha da lâmpada a ser acesa é realizada conforme os valores da sequência armazenada no vetor “sequencia”.

Pronto, as funcionalidades já estão implementadas. Porém, ainda não as estamos utilizando. Para testarmos, abra o arquivo “HelloWorldScene.cpp” e adicione as seguintes linhas de código:

schedule(schedule_selector(HelloWorld::aumentaSequencia),1.5);

schedule(schedule_selector(HelloWorld::mostraSequencia),2);

logo abaixo dessa:

HelloWorld::sequencia->retain();

e essas linhas de código:

schedule(schedule_selector(HelloWorld::aumentaSequencia),0.6*i + 1.5);

schedule(schedule_selector(HelloWorld::mostraSequencia),0.6*i + 2);

logo abaixo dessa:

HelloWorld::lampDir->runAction(CCSequence::create(seq4));

Com essas modificações, nós fazemos com que a sequência seja aumentada e apresentada dois segundos após o término da última apresentação. A Figura 1 ilustra uma sequência sendo mostrada, onde a lâmpada inferior está acesa no momento da apresentação.

Figura 1 - Sequência sendo apresentada
Figura 1 – Sequência sendo apresentada

 

 

Vimos nesse tutorial como fazer com que a sequência seja criada de forma aleatória. Para isso, chamamos um método que sorteia aleatoriamente um valor entre 0 e 3 para ser adicionado a sequência. Também implementamos um método que mostra a sequência ao jogador, conforme os valores numéricos já sorteados anteriormente.

No próximo tutorial, nós implementaremos a interação com o jogo por meio dos botões coloridos.

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