{JAVA} Rilevamento collisioni rettangolari [chiuso]
** Ciao ragazzi, ho 2 domande.
- perché la parola "Hit" non viene visualizzata.
- che tipo di codice devo aggiungere per fare in modo che questi 2 rects si scontrino e rimbalzino l'un l'altro in base al mio codice. Dammi solo un suggerimento. lo farò io. Di seguito è riportato il codice per la domanda 1. Grazie. **
////////////////////////////////////////////////// /////
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();
}
}
Risposte
Non hai letto il javadoc per il costruttore no-arg della classe Rectangle?
Costruisce un nuovo rettangolo il cui angolo in alto a sinistra è a (0, 0) nello spazio delle coordinate e la cui larghezza e altezza sono entrambe zero.
Ciò significa che r1e r2hanno dimensione zero e quindi non possono intersecarsi. Devi dare r1e r2dimensioni quando le crei. Nota che il metodo fillRect(), in classe java.awt.Graphics, dipinge semplicemente una regione dello schermo. Non ha niente a che fare con r1e r2. Quindi dovresti cambiare queste due linee in metodopaintComponent()
Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle();
a questa:
Rectangle r1 = new Rectangle(x, 10, 50, 30);
Rectangle r2 = new Rectangle(x2, 10, 50, 30);
Quindi si intersecheranno.
Per quanto riguarda la tua seconda domanda. È necessario verificare, nel metodo actionPerformed(), se i rettangoli r1e r2si intersecano e se lo fanno, è necessario invertire il senso di marcia - esattamente come si fa quando uno dei rettangoli raggiunge il bordo della JPanel. Per fare ciò, potresti creare r1e r2membri della classe f5.
Il codice seguente mostra come ottenere entrambe le richieste, ovvero determinare quando i rettangoli si intersecano e farli "rimbalzare" l'uno sull'altro quando si intersecano.
È necessaria solo un'istanza di Timer, quindi non è necessario crearne una nuova ogni volta in method paintComponent(). Puoi crearlo una volta, nel costruttore di class f5.
Notare che i membri della classe f5dovrebbero essere membri di istanza e non membri statici. Si noti inoltre che, secondo le convenzioni di denominazione java , il nome della classe dovrebbe essere 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();
}
}
Le coordinate dei rettangoli non sono definite in questo momento, quindi non si intersecano (il confronto restituisce sempre
false). Stai solo creandor1er2senza definire nulla. Dovresti inizializzarli usando il costruttorenew Rectangle(int x, int y, int width, int height).Un modo è creare un campo classe per memorizzare le coordinate del rettangolo, controllare ripetutamente le loro coordinate per vedere se entrano in collisione.