{JAVA} Detecção de colisão retângulo [fechado]
** Oi pessoal, tenho 2 perguntas.
- porque a palavra "Hit" não aparece.
- que tipo de código eu preciso adicionar para fazer esses 2 retos colidirem e se chocarem com base no meu código. Apenas dê uma dica. Vou fazer isso sozinho. Abaixo está o código da pergunta 1. Obrigado. **
//////////////////////////////////////////////////////// /////
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class f5 extends JPanel implements ActionListener {
static JFrame frame;
static Timer t;
static int x, velx, x2, velx2;
f5() {
t = new Timer(5, this);
x = 100;
x2 = 400;
velx = 2;
velx2 = 2;
frame = new JFrame();
frame.setSize(500, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(this);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle();
g.setColor(Color.BLUE);
g.fillRect(x, 10, 50, 30);
g.setColor(Color.RED);
g.fillRect(x2, 10, 50, 30);
if(r1.intersects(r2)){
g.drawString("HIT!!!!!", 250, 200);
}
t.start();
}
public void actionPerformed(ActionEvent e) {
if(x < 0 || x > 450) {
velx = -velx;
}
if(x2 < 0 || x2 > 450) {
velx2 = -velx2;
}
x -= velx;
x2 += velx2;
repaint();
}
public static void main(String args[]){
new f5();
}
}
Respostas
Você não leu o javadoc para o construtor sem arg da classe Rectangle?
Constrói um novo retângulo cujo canto superior esquerdo está em (0, 0) no espaço de coordenadas e cuja largura e altura são zero.
Isso significa que r1e r2têm tamanho zero e, portanto, não podem se cruzar. Você precisa dar r1e r2dimensionar ao criá-los. Observe que o método fillRect(), em aula java.awt.Graphics, simplesmente pinta uma região da tela. Não tem nada a ver com r1e r2. Portanto, você deve alterar essas duas linhas no métodopaintComponent()
Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle();
para isso:
Rectangle r1 = new Rectangle(x, 10, 50, 30);
Rectangle r2 = new Rectangle(x2, 10, 50, 30);
Então eles se cruzarão.
Com relação à sua segunda pergunta. Você precisa verificar, no método actionPerformed(), se os retângulos r1e se r2cruzam e, se o fizerem, será necessário inverter a direção do movimento - exatamente como você faz quando um dos retângulos atinge a borda do JPanel. Para fazer isso, você pode fazer r1e r2membros da classe f5.
O código a seguir mostra como alcançar ambas as suas solicitações, ou seja, determinar quando os retângulos se cruzam e fazer com que eles "saltem" entre si quando se cruzam.
Você só precisa de uma instância de Timer, portanto, não deve criar uma nova cada vez no método paintComponent(). Você pode criá-lo uma vez, no construtor da classe f5.
Observe que os membros da classe f5devem ser membros de instância e não membros estáticos. Observe também que, de acordo com as convenções de nomenclatura java , o nome da classe deve ser F5.
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class F5 extends JPanel implements ActionListener {
private JFrame frame;
private Timer t;
private int x, velx, x2, velx2;
private Rectangle r1;
private Rectangle r2;
F5() {
t = new Timer(5, this);
x = 100;
x2 = 400;
r1 = new Rectangle(x, 10, 50, 30);
r2 = new Rectangle(x2, 10, 50, 30);
velx = 2;
velx2 = 2;
frame = new JFrame();
frame.setSize(500, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.setVisible(true);
t.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
r1 = new Rectangle(x, 10, 50, 30);
r2 = new Rectangle(x2, 10, 50, 30);
g.setColor(Color.BLUE);
g.fillRect(x, 10, 50, 30);
g.setColor(Color.RED);
g.fillRect(x2, 10, 50, 30);
}
public void actionPerformed(ActionEvent e) {
if (x < 0 || x > 450 || r1.intersects(r2)) {
velx = -velx;
}
if (x2 < 0 || x2 > 450 || r1.intersects(r2)) {
velx2 = -velx2;
}
x -= velx;
x2 += velx2;
repaint();
}
public static void main(String args[]) {
new F5();
}
}
As coordenadas dos retângulos não estão definidas agora, então eles não se cruzarão (a comparação sempre retorna
false). Você está apenas criandor1er2sem definir nada. Você deve inicializá-los usando o construtornew Rectangle(int x, int y, int width, int height).Uma maneira é criar um campo de classe para armazenar a coordenada do retângulo, verificar repetidamente sua coordenada para ver se eles colidem.