{JAVA} Detección de colisión rectangular [cerrado]
** Hola chicos, tengo 2 preguntas.
- por qué la palabra "Hit" no aparece.
- qué tipo de código necesito agregar para que estos 2 rectos colisionen y reboten entre sí según mi código. Solo dame una pista. lo hare yo mismo. A continuación se muestra el código de la pregunta 1. Gracias. **
//////////////////////////////////////////////////// /////
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();
}
}
Respuestas
¿No leíste el javadoc para el constructor de clase sin argumentosRectangle ?
Construye un nuevo rectángulo cuya esquina superior izquierda está en (0, 0) en el espacio de coordenadas, y cuyo ancho y alto son ambos cero.
Esto significa que r1y r2tienen un tamaño de cero y por lo tanto no pueden cruzarse. Necesitas dar r1y r2dimensiones cuando las creas. Tenga en cuenta que el método fillRect(), en clase java.awt.Graphics, simplemente pinta una región de la pantalla. No tiene nada que ver con r1y r2. Entonces deberías cambiar estas dos líneas en el métodopaintComponent()
Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle();
a esto:
Rectangle r1 = new Rectangle(x, 10, 50, 30);
Rectangle r2 = new Rectangle(x2, 10, 50, 30);
Entonces se cruzarán.
Respecto a tu segunda pregunta. Debe verificar, en el método actionPerformed(), si los rectángulos r1y se r2cruzan y, si lo hacen, debe invertir la dirección del movimiento, exactamente como lo hace cuando uno de los rectángulos alcanza el borde del JPanel. Para hacer eso, podrías hacer r1y r2miembros de la clase f5.
El siguiente código muestra cómo lograr ambas solicitudes, es decir, determinar cuándo se cruzan los rectángulos y hacer que "reboten" entre sí cuando se crucen.
Solo necesita una instancia de Timer, por lo que no debe crear una nueva cada vez en el método paintComponent(). Puedes crearlo una vez, en el constructor de class f5.
Tenga en cuenta que los miembros de la clase f5deben ser miembros de instancia y no miembros estáticos. También tenga en cuenta que de acuerdo con las convenciones de nomenclatura de Java , el nombre de la clase debería 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();
}
}
Las coordenadas de los rectángulos no están definidas en este momento, por lo que no se cruzarán (la comparación siempre regresa
false). Estás creandor1yr2sin definir nada. Deberías inicializarlos usando constructornew Rectangle(int x, int y, int width, int height).Una forma es crear un campo de clase para almacenar las coordenadas del rectángulo, verificar repetidamente sus coordenadas para ver si chocan.