Pages

Banner

quarta-feira, 13 de junho de 2012

JAVA GAMES 2D::Colisão I::10

"
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 > 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 >= obj2X && obj1X <= obj2X + obj2W)
    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)
    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= 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 >= X do Objeto 2 e ao mesmo tempo o X de P <= X+largura do Objeto 2 ..... E ao mesmo tempo Y de P >= Y do Objeto 2 e ao mesmo tempo o Y de P <= 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 >= obj2X && obj1X <= obj2X + obj2W)
    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)
    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= 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 \_(^_^)_/
"

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 > 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 >= obj2X && obj1X <= obj2X + obj2W)
    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)
    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= 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 >= X do Objeto 2 e ao mesmo tempo o X de P <= X+largura do Objeto 2 ..... E ao mesmo tempo Y de P >= Y do Objeto 2 e ao mesmo tempo o Y de P <= 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 >= obj2X && obj1X <= obj2X + obj2W)
    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)
    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {
   return true;
  } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= 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 \_(^_^)_/
Comentários
0 Comentários

0 comentários:

Postar um comentário