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:


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);

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()
:

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:
- Função
resetPlayer()
como callback - Um delay menor
- Sem repetição (loop)
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);

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

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:
- Uma na posição do jogador
- Outra na posição do inimigo

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

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.