Atividade 6 - Reiniciando o Jogador após Ser Destruído

Nós já criamos inimigos bem sólidos, mas agora existe um problema — eles não fazem nada com o jogador!
Especificamente, eles não conseguem te machucar de nenhuma forma. Vamos mudar isso.
No jogo final, haverá duas maneiras de você receber dano: ser atingido por um laser inimigo ou encostar diretamente em um inimigo. Vamos começar pelo segundo caso, pois é mais simples.

A colisão no Phaser é relativamente fácil de implementar.


Primeiro, vamos importar uma spritesheet de explosão e implementar sua animação na Scene 1:

load_sprite create_sprite

Essa será a explosão que toca quando o jogador é destruído!


O Phaser possui formas bem práticas de lidar com colisões entre objetos.
Podemos simplesmente adicionar esta linha no create() da Scene 2:

this.physics.add.overlap(this.player, this.enemies, this.hurtPlayer, null, this);
overlap with player

Essa linha chama o método hurtPlayer() quando this.player e algum inimigo do grupo this.enemies se encostam.
O método é chamado passando o jogador e o inimigo como argumentos.


Agora vamos criar o método hurtPlayer():

hurtPlayer

Primeiro, destruímos o inimigo e desativamos o jogador com:

enemy.destroy();
player.disableBody(true, true);

Isso faz o inimigo desaparecer e o jogador ficar invisível e não interativo (mas ainda existe no código).


Agora, vamos fazer o jogador reviver após uma pequena pausa (dando tempo para o jogador reagir ao dano).
Para isso, usaremos um timer (como fizemos para mudar a direção dos inimigos), mas com:


No método resetPlayer(), escolha uma coordenada para o respawn e defina a posição (X, Y) do jogador.
Depois, habilite o jogador novamente com:

this.player.enableBody(true, x, y, true, true);
reset_player

Agora vamos criar um novo objeto de explosão editando explosion.js:

explosion

Ele estende Phaser.GameObjects.Sprite, o que nos permite usar o construtor dessa classe.
Esse objeto vai tocar a animação de explosão na posição especificada.
O código fica todo no construtor e requer apenas duas linhas para serem preenchidas.


Depois, volte ao hurtPlayer() na Scene 2 e crie duas explosões:

  1. Uma na posição do jogador
  2. Outra na posição do inimigo
create_explosion

Para deixar o renascimento do jogador mais suave, vamos usar um tween após ele aparecer:

reset_tween

O tween é usado para animar alguma característica do objeto.
Neste caso, vamos animar a alpha (visibilidade) do jogador, começando em 0.5 até chegar a 1:

var tween = this.tweens.add({
    targets: this.player,
    y: config.height - 64,
    ease: 'Power1',
    duration: 1500,
    repeat: 0,
    onComplete: function(){
        this.player.alpha = 1;
    },
    callbackScope: this
});

Agora sim! A animação de revival do jogador fica muito mais suave.

collision