Páginas

sexta-feira, 31 de agosto de 2012

Verificando colisões entre sprites

Nos jogos não basta os sprites se moverem pelo cenário ou apresentarem uma animação de imagens. Eles precisam interagir uns com os outros para termos um game mais interessante. Como fazer isso? Através de colisões!

Uma colisão ocorre quando dois objetos tem interseção em algum ponto do plano cartesiano (aquele gráfico x y).

Então com colisões, nós programadores podemos fazer que um sprite interaja com outro, quando tal colisão acontecer.

O java 2d facilita a detecção de colisões.
Vamos supor que estamos fazendo um simples jogo de futebol que consiste em levar a bola até o gol.
A bola é um sprite, o gol é outro.
Enquanto a bola se move pelo cenario nada acontece, porem quando ela colide com o sprite gol, um gol deve aparecer no placar.

A imagem da bola tem suas dimensões de altura e de largura. assim como o gol. A bola está numa posição x,y do plano cartesiano, o gol está em outro ponto.

Você pode tentar descobrir se colidiu no braço, se x da bola > x do gol, etc.etc.

Porém o Java facilita muito as coisas. A classe Rectangle possui o conveniente método intersects().
Vejamos como usar:
Crie esse método:

public boolean colide(Sprite sprite1, Sprite sprite2) {
  Rectangle r1 = new Rectangle(sprite1.getX(), sprite1.getY(), sprite1.getWidth(), sprite1.getHeight());
  Rectangle r2 = new Rectangle(sprite2.getX(), sprite2.getY(), sprite2.getWidth(), sprite2.getHeight());
  if (r1.intersects(r2)) {
    return true;
  }
  return false;
}


Agora para saber se houve colisão é só usa-lo:


if(colide(bola, gol)){
  //GOOOOOOOOOOOOOLLL
}

Até um próximo post.
Gustavo Marques.

5 comentários:

  1. Legal, mas nesse caso, que eu devo criar o método colidir(){}, eu posso já aplicar isso a objetos já instanciados?

    ResponderExcluir
    Respostas
    1. Olá, na verdade tanto faz. Uma boa maneira é você criar uma classe abstrata.
      Por exemplo:

      public class Sprite{
      private int x;
      private int y;
      private int w;//largura
      private int h;//altura

      //getters e setters

      //verifica colisão
      public boolean colideCom(Sprite outro) {
      Rectangle r1 = new Rectangle(x,y,w,h);//esse sprite
      Rectangle r2 = new Rectangle(outro.getX(), outro.getY(), outro.getW(), outro.getH());
      if (r1.intersects(r2)) {
      return true;
      }
      return false;
      }

      }


      Agora Crie dois Sprites:

      Sprite policia = new Sprite();
      heroi.setY(10);
      heroi.setX(10);
      heroi.setW(10);
      heroi.setH(10);

      Sprite ladrao = new Sprite();
      ladrao.setY(10);
      ladrao.setX(10);
      ladrao.setW(10);
      ladrao.setH(10);

      //todos os dois objetos possuem o metodo colideCom
      if(policia.colideCom(ladrao)){
      //PEGOU!!
      }


      Fazendo dessa forma o método colide com estará disponível a qualquer objeto da classe Sprite, ou de classes que herdam de Sprite.

      att

      Excluir
    2. A classe pode ser abastrata (forçando voce implementar ela algo tipo public class Carro extends Sprite) ou concreta como a do exemplo acima.

      att

      Excluir
  2. Esses retângulos são retângulos circundantes?

    ResponderExcluir
    Respostas
    1. Apenas trabalhe com Rectangle(x,y,w,h).

      x= posição do vertice superior esquerdo no eixo horizontal
      y= posição do vertice superior esquerdo no eixo vertical
      w= largura do retangulo
      h= altura do retangulo

      att

      Excluir

Veja também

Related Posts Plugin for WordPress, Blogger...