Tutorial FP 5 – Colisão Basica
Autor: Luiz Eduardo da Silva | Publicado: 2011-11-25T08:35:00-08:00

Se você leu os tutoriais anteriores, você já sabe como fazer uma Entity aparecer na tela e mover de um lado para o outro com o teclado.
Mas uma das coisas mais uteis para fazer em um game é fazer com que entidades interajam em entre si, e FP tem umas funções de colisões que resolvem nosso problema e irão ser explicadas neste tutorial.

ADICIONANDO HITBOXES

FP usa retangulos para toda colisão entre entidades.
Você define uma area retangular de colisão, chamada hitbox, e então você pode usar as funções do FP para testar se a hitbox de uma Entity intercepta a hitbox de outra Entity.
Então se tivermos uma Entity chamada Player, podemos definir sua hitbox assim:


package
{
 import net.flashpunk.Entity;

 public class Player extends Entity
 {
  public function Player()
  {
   // Aqui eu atribuo a largura e altura da hitbox com a função setHitbox().
   setHitbox(50, 50);

   // Aqui eu atribuo os mesmos valores para as propriedades do Player.
   width = 50;
   height = 50;
  }
 }
}

Eu atribuo os valores da hitbox de duas maneiras aqui. Ambas funcionam da mesma forma, então uso a que preferir.
Agora que temos nossa Entity com uma hitbox de 50x50, vamos criar outra Entity para colidir com nosso Player. Vamos chama-lá de Bullet, e vamos checar se o Player esta colidindo com ela,

Nossa classe Bullet vai ficar assim:


package
{
 import net.flashpunk.Entity;

 public class Bullet extends Entity
 {
  public function Bullet()
  {
   setHitbox(10, 10);
  }
 }
}

TIPOS DE COLISÃO

Agora que criamos nossas Entidades, precisamos de mais uma linha para identificar se interceptam o objeto correto:


package
{
 import net.flashpunk.Entity;

 public class Bullet extends Entity
 {
  public function Bullet()
  {
   setHitbox(10, 10);
   type = "bullet";
  }
 }
}

Aqui, eu atribui um tipo para o Entity Bullet, com o valor "bullet". Isto faz com que o FP o categorize como tipo "bullet", porque quando queremos checar por uma collisão, temos que providenciar um tipo a ser comparado.
NOTA:
Tipos de Entidades devem ter o valor string, e não devem compartilhar o mesmo nome de seu objeto.
Você pode ter diferentes classes com o tipo "solid", ams deve se lembrar que a checagem é sensivel a tabulação(maiuscula e minuscula)Então quando uma intance de Bullet for adicionada ao nosso World, ela sera adicionada ao grupo "bullet". No proximo passo irei mostrar como checar se nosso Player está colidindo com um objeto Bullet usando este tipo aplicado.

COLIDINDO ENTIDADES

Agora que nossa Entity Bullet esta incluida do grupo "bullet", nos podemos voltar para nosso Player e usar a função collide() para checar se ele está colidindo com alguma instancia do tipo "bullet".


package
{
 import net.flashpunk.Entity;

 public class Player extends Entity
 {
  public function Player()
  {
   setHitbox(50, 50);
  }

  override public function update():void
  {
   if (collide("bullet", x, y))
   {
    trace("Player está colidindo com o tipo 'bullet'");
   }
  }
 }
}

Então aqui, usamos collide() para checar a colisão na posição de Player. se você quiser 10 pixels de distancia, você pode fazer assim:


package
{
 import net.flashpunk.Entity;

 public class Player extends Entity
 {
  public function Player()
  {
   setHitbox(50, 50);
  }

  override public function update():void
  {
   if (collide("bullet", x + 10, y))
   {
    trace("Player está colidindo com o tipo 'bullet' em (x + 10)");
   }
  }
 }
}

Mas FP também suporta colisões mais especificas. Vamos dizer que nós criamos nossa Bullet com a função de destruir a Entity, removendo-a do World, assim:


package
{
 import net.flashpunk.Entity;
 import net.flashpunk.FP;

 public class Bullet extends Entity
 {
  public function Bullet()
  {
   setHitbox(10, 10);
   type = "bullet";
  }

  public function destroy():void
  {
   // Aqui podemos colocar algum tratamento especifico para destroir a Bullet.
   FP.world.remove(this);
  }
 }
}

Então, se quisermos que a Bullet seja destruida quando colidir com o Player? Para isto, vamos chamar a função collide() dentro do Player, assim:


package
{
 import net.flashpunk.Entity;

 public class Player extends Entity
 {
  public function Player()
  {
   setHitbox(50, 50);
  }

  override public function update():void
  {
   // Atribua a bala colidida na variavel temporaria b..
   var b:Bullet = collide("bullet", x, y) as Bullet;

   // Checamos se b não está vazia.
   if (b)
   {
    // Chamando a função de destruição da Bullet.
    b.destroy();
   }
  }
 }
}

Desta vez, ao invés de colocar collide() em um if(), nos atribuimos o retorno dele em uma variavel.
O que a função collide() faz é checar o World por qualquer interceção de "bullet" e, se achar, irá retornar o valor do objeto. Caso não ache nenhuma interceção, ira retornar o valor null.

Espero que estajam aprendendo o bastante. qualquer duvidas comentem abaixo.

Fonte : FlashPunk

Créditos : ChevyRay