{JAVA} 직사각형 충돌 감지 [닫힘]
** 안녕하세요, 질문이 2 개 있습니다.
- "Hit"단어가 나타나지 않는 이유.
- 이 두 개의 rects가 충돌하고 내 코드를 기반으로 서로 튀게하려면 어떤 유형의 코드를 추가해야하는지 힌트 만주세요. 내가 직접 할게. 다음은 질문 1의 코드입니다. 감사합니다. **
///////////////////////////////////////////////// /////
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();
}
}
답변
인수가 없는 클래스 생성자 에 대한 javadoc 을 읽지 않았습니까 Rectangle?
좌표 공간에서 왼쪽 위 모서리가 (0, 0)이고 너비와 높이가 모두 0 인 새 Rectangle을 구성합니다.
즉 r1, r2크기가 0이므로 교차 할 수 없습니다. 당신이 그들을 만들 때 r1및 r2치수 를 제공해야 합니다. fillRect()클래스의 메서드 는 java.awt.Graphics단순히 화면 영역을 그립니다. 그것은과는 아무 상관이 없습니다 r1와 r2. 따라서이 두 줄을 방법으로 변경해야합니다.paintComponent()
Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle();
이에:
Rectangle r1 = new Rectangle(x, 10, 50, 30);
Rectangle r2 = new Rectangle(x2, 10, 50, 30);
그런 다음 교차합니다.
두 번째 질문에 대해. 방법 actionPerformed()에서 직사각형 r1과 r2교차 하는지 여부 를 확인해야하며, 교차하는 경우 이동 방향을 반대로해야합니다 JPanel. 직사각형 중 하나가 . 그렇게하기 위해서는, 당신은 만들 수 r1및 r2클래스의 멤버 f5.
아래 코드는 두 요청을 모두 달성하는 방법을 보여줍니다. 즉, 직사각형이 교차하는시기를 결정하고 교차 할 때 서로 "반동"되도록합니다.
의 인스턴스는 하나만 필요 Timer하므로 메서드에서 매번 새 인스턴스를 만들면 안됩니다 paintComponent(). 클래스 생성자에서 한 번 만들 수 있습니다 f5.
클래스의 멤버는 f5정적 멤버가 아닌 인스턴스 멤버 여야합니다. 또한 Java 명명 규칙 에 따라 클래스 이름은 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();
}
}
직사각형의 좌표는 지금 정의되지 않았으므로 교차하지 않습니다 (비교는 항상을 반환합니다
false). 당신은 작성r1하고r2아무것도 정의하지 않고. constructor를 사용하여 초기화해야합니다new Rectangle(int x, int y, int width, int height).한 가지 방법은 사각형의 좌표를 저장하는 클래스 필드를 만들고 해당 좌표가 충돌하는지 반복적으로 확인하는 것입니다.