{JAVA} Deteksi tabrakan persegi panjang [ditutup]
** Hai teman-teman, saya punya 2 pertanyaan.
- mengapa kata "Hit" tidak muncul.
- jenis kode apa yang perlu saya tambahkan untuk membuat 2 rects ini bertabrakan dan saling memantul berdasarkan kode saya. Beri saya petunjuk. saya akan melakukannya sendiri. Berikut kode untuk pertanyaan 1. Terima kasih. **
//////////////////////////////////////////////// /////
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();
}
}
Jawaban
Apakah Anda tidak membaca javadoc untuk konstruktor kelas tanpa argumenRectangle ?
Membuat persegi panjang baru yang sudut kiri atasnya berada di (0, 0) dalam ruang koordinat, dan yang lebar dan tingginya sama-sama nol.
Ini berarti bahwa r1dan r2memiliki ukuran nol dan karenanya mereka tidak dapat berpotongan. Anda perlu memberi r1dan r2dimensi saat Anda membuatnya. Perhatikan bahwa metode fillRect(), di kelas java.awt.Graphics, cukup melukis wilayah layar. Ini tidak ada hubungannya dengan r1dan r2. Jadi Anda harus mengubah metode dua baris inipaintComponent()
Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle();
untuk ini:
Rectangle r1 = new Rectangle(x, 10, 50, 30);
Rectangle r2 = new Rectangle(x2, 10, 50, 30);
Kemudian mereka akan berpotongan.
Mengenai pertanyaan kedua Anda. Anda perlu memeriksa, dalam metode actionPerformed(), apakah persegi panjang r1dan r2berpotongan dan jika ya, Anda perlu membalik arah gerakan - persis seperti yang Anda lakukan ketika salah satu persegi panjang mencapai tepi JPanel. Untuk melakukan itu, Anda dapat membuat r1dan r2anggota kelas f5.
Kode di bawah ini menunjukkan cara mencapai kedua permintaan Anda, yaitu menentukan kapan persegi panjang berpotongan dan membuatnya "memantul" satu sama lain saat keduanya berpotongan.
Anda hanya memerlukan satu contoh Timer, jadi Anda tidak boleh membuat yang baru setiap kali dalam metode paintComponent(). Anda dapat membuatnya sekali, di konstruktor kelas f5.
Perhatikan bahwa anggota kelas f5haruslah anggota instance dan bukan anggota statis. Juga perhatikan bahwa menurut konvensi penamaan java , nama kelas harus 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();
}
}
Koordinat persegi panjang tidak ditentukan sekarang, jadi mereka tidak akan berpotongan (perbandingan selalu kembali
false). Anda hanya membuatr1danr2tanpa mendefinisikan apapun. Anda harus menginisialisasi mereka menggunakan konstruktornew Rectangle(int x, int y, int width, int height).Salah satu caranya adalah Anda dapat membuat bidang kelas untuk menyimpan koordinat persegi panjang, berulang kali memeriksa koordinatnya untuk melihat apakah keduanya bertabrakan.