{JAVA} 직사각형 충돌 감지 [닫힘]

Sep 10 2020

** 안녕하세요, 질문이 2 개 있습니다.

  1. "Hit"단어가 나타나지 않는 이유.
  2. 이 두 개의 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();
            }
             }

답변

Abra Sep 12 2020 at 06:40

인수가 없는 클래스 생성자 에 대한 javadoc 을 읽지 않았습니까 Rectangle?

좌표 공간에서 왼쪽 위 모서리가 (0, 0)이고 너비와 높이가 모두 0 인 새 Rectangle을 구성합니다.

r1, r2크기가 0이므로 교차 할 수 없습니다. 당신이 그들을 만들 때 r1r2치수 를 제공해야 합니다. fillRect()클래스의 메서드 는 java.awt.Graphics단순히 화면 영역을 그립니다. 그것은과는 아무 상관이 없습니다 r1r2. 따라서이 두 줄을 방법으로 변경해야합니다.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()에서 직사각형 r1r2교차 하는지 여부 를 확인해야하며, 교차하는 경우 이동 방향을 반대로해야합니다 JPanel. 직사각형 중 하나가 . 그렇게하기 위해서는, 당신은 만들 수 r1r2클래스의 멤버 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();
    }
}
HungVu Sep 11 2020 at 03:04
  1. 직사각형의 좌표는 지금 정의되지 않았으므로 교차하지 않습니다 (비교는 항상을 반환합니다 false). 당신은 작성 r1하고 r2아무것도 정의하지 않고. constructor를 사용하여 초기화해야합니다 new Rectangle(int x, int y, int width, int height).

  2. 한 가지 방법은 사각형의 좌표를 저장하는 클래스 필드를 만들고 해당 좌표가 충돌하는지 반복적으로 확인하는 것입니다.