sexta-feira, 31 de maio de 2013

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

1:  import java.awt.*;  
2:  import java.awt.image.BufferedImage;  
3:  import java.io.File;  
4:  import javax.swing.ImageIcon;  
5:  import javax.swing.JFrame;  
6:  public class Game extends JFrame {  
7:   BufferedImage backBuffer;  
8:   int FPS = 30;  
9:   int janelaW = 500;  
10:   int janelaH = 500;  
11:   // --------------------------------------------------------------------  
12:   // OBSERVEM ESSAS VÁRIÁVEIS (ISSO PODERIA SER ATRIBUTOS DE UMA CLASSE!)  
13:   // --------------------------------------------------------------------  
14:   int obj1X = 0; // COORDENADA X  
15:   int obj1Y = 225; // COORDENADA Y  
16:   int obj1W = 50; // LARGURA = Width  
17:   int obj1H = 50; // ALTURA = Height  
18:   boolean objeto1Colediu = false;  
19:   int obj2X = 400;  
20:   int obj2Y = 200;  
21:   int obj2W = 50;  
22:   int obj2H = 50;  
23:   // --------------------------------------------------------------------  
24:   // ESSE MÉTODO VAI MOVER O OBJETO ATÉ A COORDENADA X = 390  
25:   // PARA QUE ELE TOQUE O OBJETO 2  
26:   // MAS NÃO IMPORTA COMO ELE SE MOVA, UM MÉTODO VAI TRATAR DE  
27:   // VERIFICAR SE OUVE COLISÃO OU NÃO!  
28:   // --------------------------------------------------------------------  
29:   public void moveObjeto1() {  
30:   obj1X += 2;  
31:   if (obj1X > 500) {  
32:    obj1X = 0;  
33:   }  
34:   }  
35:   // --------------------------------------------------------------------  
36:   // SE O OBJETO COLEDIR APARECERÁ UM TEXTO INFORMANDO!!!  
37:   // ESSE MÉTODO VAI SER CHAMANDO LÁ NO DENTRO DO MÉTODO desenharGraficos()  
38:   // --------------------------------------------------------------------  
39:   public void exibeTexto() {  
40:   Graphics bbg = backBuffer.getGraphics();  
41:   if (objeto1Colediu) {  
42:    bbg.setColor(Color.RED);  
43:    bbg.drawString("UIII fui tocado!!!", 200, 100);  
44:   }  
45:   }  
46:   // --------------------------------------------------------------------  
47:   // ESSE É O NOSSO MÉTODO QUE VAI TRATAR A COLISÃO  
48:   // ESSE MÉTODO RECEBE COMO ARGUMENTO: X, Y, W, H do Obj1 e Obj2  
49:   // NÃO SE PREOCUPE NOS VAMOS EXPLICAR ESSA LAVAGEM DE CÓDIGO!!!  
50:   // --------------------------------------------------------------------  
51:   public boolean colisao(int obj1X, int obj1Y, int obj1W, int obj1H,  
52:    int obj2X, int obj2Y, int obj2W, int obj2H) {  
53:   if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)  
54:    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {  
55:    return true;  
56:   } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)  
57:    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {  
58:    return true;  
59:   } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)  
60:    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {  
61:    return true;  
62:   } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)  
63:    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {  
64:    return true;  
65:   } else {  
66:    return false;  
67:   }  
68:   }  
69:   // --------------------------------------------------------------------  
70:   public void atualizar() {  
71:   objeto1Colediu = colisao(obj1X, obj1Y, obj1W, obj1H, obj2X, obj2Y,  
72:    obj2W, obj2H);  
73:   moveObjeto1();  
74:   }  
75:   public void desenharGraficos() {  
76:   Graphics g = getGraphics(); // ISSO JÁ ESTAVA AQUI  
77:   Graphics bbg = backBuffer.getGraphics();// ISSO TAMBÉM JÁ ESTAVA AQUI...  
78:   // ==================================================================================  
79:   bbg.setColor(Color.WHITE);  
80:   bbg.fillRect(0, 0, janelaW, janelaH);// DESENHA UM FUNDO BRANCO NA TELA!  
81:   // EXIBE UM TEXTO CASO O OBJETO COLIDA!  
82:   exibeTexto();  
83:   // DESENHA O OBJETO 2  
84:   bbg.setColor(Color.BLUE);  
85:   bbg.fillRect(obj2X, obj2Y, obj2W, obj2H);  
86:   // DESENHA O OBJETO 1 //com transparência  
87:   // new Color(red,green, blue, alpha) o alpha é o valor da trasnparência  
88:   // vai de 0 à 255  
89:   bbg.setColor(new Color(0, 255, 0, 200));  
90:   bbg.fillRect(obj1X, obj1Y, obj1W, obj1H);  
91:   // ==================================================================================  
92:   g.drawImage(backBuffer, 0, 0, this);// OBS: ISSO DEVE FICAR SEMPRE NO  
93:        // FINAL!  
94:   }  
95:   public void inicializar() {  
96:   setTitle("Tutorial 10 Colisão simples!");  
97:   setSize(janelaW, janelaH);  
98:   setResizable(false);  
99:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
100:   setLayout(null);  
101:   setVisible(true);  
102:   backBuffer = new BufferedImage(janelaW, janelaH,  
103:    BufferedImage.TYPE_INT_RGB);  
104:   }  
105:   public void run() {  
106:   inicializar();  
107:   while (true) {  
108:    atualizar();  
109:    desenharGraficos();  
110:    try {  
111:    Thread.sleep(1000 / FPS);  
112:    } catch (Exception e) {  
113:    System.out.println("Thread interrompida!");  
114:    }  
115:   }  
116:   }  
117:   public static void main(String[] args) {  
118:   Game game = new Game();  
119:   game.run();  
120:   }  
121:  }  

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()
1:  public boolean colisao(int obj1X, int obj1Y, int obj1W, int obj1H,  
2:    int obj2X, int obj2Y, int obj2W, int obj2H) {  
3:   if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)  
4:    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {  
5:    return true;  
6:   } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)  
7:    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {  
8:    return true;  
9:   } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)  
10:    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {  
11:    return true;  
12:   } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)  
13:    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {  
14:    return true;  
15:   } else {  
16:    return false;  
17:   }  
18:   }  

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!!!

Nenhum comentário:

Postar um comentário