JAVA GAMES 2D::Colisão I::10
Autor: Guilherme | Publicado: 2012-06-13T13:21:00-07:00


DOWNLOAD DOS EXEMPLOS AQUI

Olá pessoal!

No tutorial de hoje iremos ver uma maneira de como testar uma colisão simples entre dois objetos! existe várias formas de testar uma colisão como: verificar se o objeto tocou a extremidade do outro, verificar se eles estão se intersectando, ou se ambos tem a mesma coordenada X e , e após constatar a colisão iremos dizer como esses objetos irão se comportar durante a colisão!







Vamos ver uma maneira de verificar essas colisões com um único método! então vamos lá! crie um pacote chamado tutorial10 no nosso projeto JAVAGAMES2D, e cole no pacote o nosso template pra jogos Game.java!

Agora observe o código abaixo (leita atentamente os comentários no código):



import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Game extends JFrame {

 BufferedImage backBuffer;
 int FPS = 30;
 int janelaW = 500;
 int janelaH = 500;
 // --------------------------------------------------------------------
 // OBSERVEM ESSAS VÁRIÁVEIS (ISSO PODERIA SER ATRIBUTOS DE UMA CLASSE!)
 // --------------------------------------------------------------------
 int obj1X = 0; // COORDENADA X
 int obj1Y = 225; // COORDENADA Y
 int obj1W = 50; // LARGURA = Width
 int obj1H = 50; // ALTURA = Height
 boolean objeto1Colediu = false;

 int obj2X = 400;
 int obj2Y = 200;
 int obj2W = 50;
 int obj2H = 50;

 // --------------------------------------------------------------------
 // ESSE MÉTODO VAI MOVER O OBJETO ATÉ A COORDENADA X = 390
 // PARA QUE ELE TOQUE O OBJETO 2
 // MAS NÃO IMPORTA COMO ELE SE MOVA, UM MÉTODO VAI TRATAR DE
 // VERIFICAR SE OUVE COLISÃO OU NÃO!
 // --------------------------------------------------------------------
 public void moveObjeto1() {
  obj1X += 2;
  if (obj1X &gt; 500) {
   obj1X = 0;
  }
 }

 // --------------------------------------------------------------------
 // SE O OBJETO COLEDIR APARECERÁ UM TEXTO INFORMANDO!!!
 // ESSE MÉTODO VAI SER CHAMANDO LÁ NO DENTRO DO MÉTODO desenharGraficos()
 // --------------------------------------------------------------------
 public void exibeTexto() {
  Graphics bbg = backBuffer.getGraphics();
  if (objeto1Colediu) {
   bbg.setColor(Color.RED);
   bbg.drawString("UIII fui tocado!!!", 200, 100);
  }
 }

 // --------------------------------------------------------------------
 // ESSE É O NOSSO MÉTODO QUE VAI TRATAR A COLISÃO
 // ESSE MÉTODO RECEBE COMO ARGUMENTO: X, Y, W, H do Obj1 e Obj2
 // NÃO SE PREOCUPE NOS VAMOS EXPLICAR ESSA LAVAGEM DE CÓDIGO!!!
 // --------------------------------------------------------------------
 public boolean colisao(int obj1X, int obj1Y, int obj1W, int obj1H,
   int obj2X, int obj2Y, int obj2W, int obj2H) {
  if ((obj1X &gt;= obj2X &amp;&amp; obj1X &lt;= obj2X + obj2W)
    &amp;&amp; (obj1Y &gt;= obj2Y &amp;&amp; obj1Y &lt;= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W &gt;= obj2X &amp;&amp; obj1X + obj1W &lt;= obj2X + obj2W)
    &amp;&amp; (obj1Y &gt;= obj2Y &amp;&amp; obj1Y &lt;= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X &gt;= obj2X &amp;&amp; obj1X &lt;= obj2X + obj2W)
    &amp;&amp; (obj1Y + obj1H &gt;= obj2Y &amp;&amp; obj1Y + obj1H &lt;= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W &gt;= obj2X &amp;&amp; obj1X + obj1W &lt;= obj2X + obj2W)
    &amp;&amp; (obj1Y + obj1H &gt;= obj2Y &amp;&amp; obj1Y + obj1H &lt;= obj2Y + obj2H)) {
   return true;
  } else {
   return false;
  }
 }

 // --------------------------------------------------------------------
 public void atualizar() {
  objeto1Colediu = colisao(obj1X, obj1Y, obj1W, obj1H, obj2X, obj2Y,
    obj2W, obj2H);
  moveObjeto1();
 }

 public void desenharGraficos() {
  Graphics g = getGraphics(); // ISSO JÁ ESTAVA AQUI
  Graphics bbg = backBuffer.getGraphics();// ISSO TAMBÉM JÁ ESTAVA AQUI...
  // ==================================================================================
  bbg.setColor(Color.WHITE);
  bbg.fillRect(0, 0, janelaW, janelaH);// DESENHA UM FUNDO BRANCO NA TELA!

  // EXIBE UM TEXTO CASO O OBJETO COLIDA!
  exibeTexto();

  // DESENHA O OBJETO 2
  bbg.setColor(Color.BLUE);
  bbg.fillRect(obj2X, obj2Y, obj2W, obj2H);

  // DESENHA O OBJETO 1 //com transparência
  // new Color(red,green, blue, alpha) o alpha é o valor da trasnparência
  // vai de 0 à 255
  bbg.setColor(new Color(0, 255, 0, 200));
  bbg.fillRect(obj1X, obj1Y, obj1W, obj1H);

  // ==================================================================================
  g.drawImage(backBuffer, 0, 0, this);// OBS: ISSO DEVE FICAR SEMPRE NO
           // FINAL!
 }

 public void inicializar() {
  setTitle("Tutorial 10 Colisão simples!");
  setSize(janelaW, janelaH);
  setResizable(false);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  setLayout(null);
  setVisible(true);
  backBuffer = new BufferedImage(janelaW, janelaH,
    BufferedImage.TYPE_INT_RGB);
 }

 public void run() {
  inicializar();
  while (true) {
   atualizar();
   desenharGraficos();
   try {
    Thread.sleep(1000 / FPS);
   } catch (Exception e) {
    System.out.println("Thread interrompida!");
   }
  }
 }

 public static void main(String[] args) {
  Game game = new Game();
  game.run();
 }
}



Muito bem... Agora vamos entender o método colisão que é o que está menos comentado no nosso código acima....
Observe a seguinte imagem:





Muito bem... temos um quadrado, e nesse quadrado temos quatro pontos (marcado de vermelho), cada ponto possui uma coordenada X e Y, conhecendo apenas as coordenadas e dimensões do nosso quadrado é possível deduzir as coordenadas de cada um desses quatro pontos, como mostra o circulo laranja... "blz... entendi... o que devemos fazer agora...?"

agora vamos verificar se cada um desses pontos está invadindo a área de outro objeto (quadrado...)

Observe a imagem abaixo:







Para verificar se cada ponto do Objeto1 está dentro do Objeto2, temos que fazer algumas verificações como mostra o circulo laranja, Observe o nosso ponto P, as coordenadas X do nosso ponto P em relação ao Objeto2 tem que ser: X de P &gt;= X do Objeto 2 e ao mesmo tempo o X de P &lt;= X+largura do Objeto 2 ..... E ao mesmo tempo Y de P &gt;= Y do Objeto 2 e ao mesmo tempo o Y de P &lt;= Y+altura do Objeto 2.



Então essas condições tem que ser verificadas para cada um dos nossos pontos 1, 2, 3 e 4! Observe novamente o nosso método colisao()




public boolean colisao(int obj1X, int obj1Y, int obj1W, int obj1H,
   int obj2X, int obj2Y, int obj2W, int obj2H) {
  if ((obj1X &gt;= obj2X &amp;&amp; obj1X &lt;= obj2X + obj2W)
    &amp;&amp; (obj1Y &gt;= obj2Y &amp;&amp; obj1Y &lt;= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W &gt;= obj2X &amp;&amp; obj1X + obj1W &lt;= obj2X + obj2W)
    &amp;&amp; (obj1Y &gt;= obj2Y &amp;&amp; obj1Y &lt;= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X &gt;= obj2X &amp;&amp; obj1X &lt;= obj2X + obj2W)
    &amp;&amp; (obj1Y + obj1H &gt;= obj2Y &amp;&amp; obj1Y + obj1H &lt;= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W &gt;= obj2X &amp;&amp; obj1X + obj1W &lt;= obj2X + obj2W)
    &amp;&amp; (obj1Y + obj1H &gt;= obj2Y &amp;&amp; obj1Y + obj1H &lt;= obj2Y + obj2H)) {
   return true;
  } else {
   return false;
  }
 }


Então perceba que se um dos nossos pontos invadir o outro objeto, o nosso método irá retornar TRUE

Observe também que o nosso método foi chamado dentro do método atualizar, então estará sendo verificado o tempo inteiro se está havendo colisão ou não, caso haja uma colisão o nosso método retorna TRUE caso não retorna FALSE. esse valor será retornado para uma variável, caso ela receba true, um texto será exibido na tela!!!

(Estudem o código atentamente!!!)

Observem como ficou o meu:










Até o nosso próximo tutorial!!!



\_(^_^)_/ Comentários em baixo \_(^_^)_/