parte 9 – Subindo as escadas do jogo

O que veremos aqui?

Neste post, mostrarei como subir as escadas, ou qualquer estrutura no jogo.

Como subir uma escada?

O comportamento esperado é que ao pular em direção à escada e apertar a tecla cima (ou simplesmente ao estar na frente da escada apertar tal tecla) faça com que o jogador suba a escada.

Espera-se também que visualmente o jogador mostre que está subindo, ou seja, fique de costas para a tela e faça movimentos de subida. Por hora, esta animação não será vista aqui, pois o tileset do dude é limitado e não tem essas imagens. Futuramente ativaremos suporte completo e o veremos de costas.

Criando nova camada para cuidar das escadas

O primeiro passo é criarmos uma nova camada no Tiled Map Editor chamada camadaEscada, e estando nela, desenhar por cima das escadas anteriormente criadas na camada cenario, novas escadas. Essa camada não será visível, ou seja, só será usada pelo código para poder saber onde estão as escadas.

A camadaEscadas contém todas as escadas do jogo, que precisam ser redesenhadas em cima da camada cenario.
A camadaEscadas contém todas as escadas do jogo, que precisam ser redesenhadas em cima da camada cenario.

Isso mesmo, a camadaEscada terá uma escada por cima de cada escada anteriormente criada no cenário. Veja como fica se ocultarmos a camada cenario:

Aqui exibindo todas as camadas menos a cenario. Para mostrar que na camadaEscadas redesenhamos elas
Aqui exibindo todas as camadas menos a cenario. Para mostrar que na camadaEscadas redesenhamos elas

Preparando o código

Após criar as escadas na nova camadaEscada, precisamos então importar essa camada no código, lembrando que essa nova camadaEscada não será visível. Apenas será utilizada para que o código encontre o posicionamento de cada escada ou estrutura escalável no jogo.

Modifique a função criaCenario, e adicione essas duas linhas logo após executar layer.resizeWorld():

function criaCenario(){
    // Código que já estava aqui...

    // Essas 2 linhas já existem, apenas adicione abaixo dela as outras duas linhas
    layer = map.createLayer('cenario');
    layer.resizeWorld();

    // Cria camada das escadas não visível
    layerEscada = map.createLayer('camadaEscada');
    layerEscada.visible = false;
}

A função criaCenario irá então ficar assim:

/**
 *  Cria cenário do jogo
 */
function criaCenario() {
    // Define que vai usar a física ARCADE - fácil no jogo
    game.physics.startSystem(Phaser.Physics.ARCADE);

    // Adiciona mapa
    map = game.add.tilemap('mapa');

    // Insere tileset
    map.addTilesetImage('tileset', 'tilesCenario');

    // Define quais blocos do tileset serão de colisão
    //map.setCollision(1);
    map.setCollisionBetween(1,5);
    map.setCollisionBetween(8,12);

    // Cria camada do cenário e define-a do tamanho do mundo
    layer = map.createLayer('cenario');
    layer.resizeWorld();

    // Cria camada das escadas não visível
    layerEscada = map.createLayer('camadaEscada');
    layerEscada.visible = false;

    // Cria o jogador
    criaJogador();

    // Chama função que cria vários inimigos
    criaInimigos();

    // Define os cursores do teclado para poder controlar o jogador
    cursors = game.input.keyboard.createCursorKeys();

    criaMoedas();

    criaTextoPontuacao();

    // Adiciona objeto de controle de músicas do jogo
    musicaMoedas = game.add.audio('collect-coin', 1, true);
    musicaKick = game.add.audio('kick', 1, true);
    musicaLose = game.add.audio('lose', 1, true);
}

Como percebe-se, esta função está crescendo bastante, futuramente precisaremos fazer um refactor nela, ou seja, quebrá-la em partes melhores à fim de deixar o código mais legível e manutenível.

Agora precisamos a todo tempo verificar se o jogador encostou em uma escada. Se pensou em editar a função atualizaJogo está correto!

Atualize a função atualizaJogo para que ela chame outra função, a verificaEscada, que como o nome já diz, faz a verificação das escadas do jogo:

function atualizaJogo() {
    game.physics.arcade.collide(jogador, layer);
    game.physics.arcade.collide(inimigos, layer, inimigoColidiuTile);

    movimentaJogador();
    verificaSeEncostouInimigo();
    verificaSeEncostouMoedas();
    verificaEscada();
}

Por fim, crie a nova função verificaEscada:

/**
 *  Função que verifica se jogador encostou em uma escada e se
 *  ao mesmo tempo pressionou a tecla cima
 */
function verificaEscada(){
    // Aqui revificamos se o jogador está em "cima" de um bloco de escada na camada layerEscada
    var encostouEmEscada = map.getTileWorldXY(jogador.body.x + 16, jogador.body.y,32,32, layerEscada);

    // Verifica se encostou em um bloco de escada e se pressionou a tecla cima
    if ( encostouEmEscada && cursors.up.isDown ) {
        // Altera gravidade do jogador
        jogador.body.gravity.y = 0;
        // Leva o jogador um pouco para cima
        jogador.body.velocity.y = -150;
        // Não permite jogador ir para o lado
        jogador.body.velocity.x = 0;
        // Define que está na escada (usada para controlar movimentos do jogador)
        jogadorNaEscada = true;
    }else{
        // Se não está na escada, restabelece a gravidade normal do jogador
        jogador.body.gravity.y = 1600;
        // Define que não está na escada
        jogadorNaEscada = false;
    }
}

Pronto, já temos o jogador subindo a escada! Veja que legal:
jogador subindo escada

Lembrando que agora basta criar um tileset do jogador subindo a escada e chamar ele na função verificaEsccada. Aí o jogador terá a experiência completa!

Futuramente faremos isso com um novo tileset do jogador e do cenário.

Divirta-se agora adicionando mais escadas, inimigos e moedas no jogo. Agora já temos algo mais animado para brincar!

Desafio

Use o conhecimento aprendido neste post para criar um chão, que se o jogador pular nele, ele morre. Por exemplo um chão de lava.

Bons estudos :)

Jogo em ação

Aqui você pode ver o código que implementamos funcionando. Neste link você pode baixar esta versão do jogo:

O que vem por aí?

No próximo post veremos como gerenciar a vida do jogador, permitindo que, caso tenha vida adicional, encoste uma vez em um inimigo e não morra.

Até breve!

Leave a Reply