{JAVA} Phát hiện va chạm hình chữ nhật [đã đóng]
** Xin chào các bạn, tôi có 2 câu hỏi.
- tại sao từ "Hit" không xuất hiện.
- loại mã nào tôi cần thêm để làm cho 2 phiên bản này va chạm và trả lại nhau dựa trên mã của tôi. Chỉ cần cho tôi một gợi ý. tôi sẽ làm nó một mình. Dưới đây là mã cho câu hỏi 1. Xin cảm ơn. **
//////////////////////////////////////////////////////// /////
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();
}
}
Trả lời
Bạn đã không đọc javadoc cho hàm tạo no-arg của lớp Rectangle?
Tạo một Hình chữ nhật mới có góc trên bên trái là (0, 0) trong không gian tọa độ và có chiều rộng và chiều cao đều bằng không.
Điều này có nghĩa là r1và r2có kích thước bằng không và do đó chúng không thể giao nhau. Bạn cần cung cấp r1và r2kích thước khi bạn tạo chúng. Lưu ý rằng phương pháp fillRect(), trong lớp java.awt.Graphics, chỉ cần vẽ một vùng của màn hình. Nó không liên quan gì đến r1và r2. Vì vậy, bạn nên thay đổi hai dòng này trong phương thứcpaintComponent()
Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle();
đến điều này:
Rectangle r1 = new Rectangle(x, 10, 50, 30);
Rectangle r2 = new Rectangle(x2, 10, 50, 30);
Sau đó, chúng sẽ giao nhau.
Về câu hỏi thứ hai của bạn. Bạn cần phải kiểm tra actionPerformed()xem các hình chữ nhật r1và hình chữ nhật có r2cắt nhau hay không và nếu chúng có giao nhau, bạn cần phải đảo ngược hướng chuyển động - chính xác như cách bạn làm khi một trong các hình chữ nhật chạm đến cạnh của JPanel. Để làm được điều đó, bạn có thể thực hiện r1và r2các thành viên trong lớp f5.
Đoạn mã dưới đây cho thấy cách đạt được cả hai yêu cầu của bạn, tức là xác định thời điểm các hình chữ nhật giao nhau và để chúng "trả lại" nhau khi chúng giao nhau.
Bạn chỉ yêu cầu một phiên bản của Timer, vì vậy bạn không nên tạo một phiên bản mới mỗi lần trong phương thức paintComponent(). Bạn có thể tạo nó một lần, trong hàm tạo của lớp f5.
Lưu ý rằng các thành viên của lớp f5phải là thành viên thể hiện chứ không phải thành viên tĩnh. Cũng lưu ý rằng theo quy ước đặt tên java , tên của lớp phải là 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();
}
}
Tọa độ của các hình chữ nhật không được xác định ngay bây giờ, vì vậy chúng sẽ không giao nhau (phép so sánh luôn trả về
false). Bạn chỉ đang tạor1vàr2không xác định bất cứ điều gì. Bạn nên khởi tạo chúng bằng cách sử dụng hàm tạonew Rectangle(int x, int y, int width, int height).Một cách là bạn có thể tạo một trường lớp để lưu trữ tọa độ của hình chữ nhật, liên tục kiểm tra tọa độ của chúng để xem liệu chúng có va chạm hay không.