{JAVA} Rechteckkollisionserkennung [geschlossen]

Sep 10 2020

** Hallo Leute, ich habe 2 Fragen.

  1. warum "Hit" Wort nicht erscheinen.
  2. Welche Art von Code muss ich hinzufügen, damit diese beiden Bereiche kollidieren und sich basierend auf meinem Code gegenseitig abprallen. Geben Sie mir nur einen Hinweis. Ich werde es selbst tun. Unten ist der Code für Frage 1. Vielen Dank. **

//////////////////////////////////////////////////////// /////

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();
            }
             }

Antworten

Abra Sep 12 2020 at 06:40

Haben Sie nicht das Javadoc für den No-Arg-Konstruktor der Klasse gelesen Rectangle?

Konstruiert ein neues Rechteck, dessen obere linke Ecke im Koordinatenraum bei (0, 0) liegt und dessen Breite und Höhe beide Null sind.

Dies bedeutet, dass r1und r2haben eine Größe von Null und daher können sie sich nicht schneiden. Sie müssen r1und r2Dimensionen angeben, wenn Sie sie erstellen. Beachten Sie, dass die Methode fillRect()im Unterricht java.awt.Graphicseinfach einen Bereich des Bildschirms malt. Es hat nichts mit r1und zu tun r2. Sie sollten diese beiden Zeilen also in der Methode ändernpaintComponent()

Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle();

dazu:

Rectangle r1 = new Rectangle(x, 10, 50, 30);
Rectangle r2 = new Rectangle(x2, 10, 50, 30);

Dann kreuzen sie sich.


Zu Ihrer zweiten Frage. Sie müssen in der Methode überprüfen, actionPerformed()ob sich die Rechtecke r1und r2Schnittpunkte schneiden, und wenn dies der Fall ist, müssen Sie die Bewegungsrichtung umkehren - genau wie wenn eines der Rechtecke den Rand des Rechtecks ​​erreicht JPanel. Um das zu tun, könnten Sie r1und r2Mitglieder der Klasse machen f5.

Der folgende Code zeigt, wie Sie beide Anforderungen erfüllen, dh bestimmen, wann sich die Rechtecke schneiden, und wie sie sich gegenseitig "abprallen", wenn sie sich schneiden.

Sie benötigen nur eine Instanz von Timer, daher sollten Sie nicht jedes Mal in der Methode eine neue erstellen paintComponent(). Sie können es einmal im Konstruktor der Klasse erstellen f5.

Beachten Sie, dass die Mitglieder der Klasse f5Instanzmitglieder und keine statischen Mitglieder sein sollten. Beachten Sie auch, dass gemäß den Java-Namenskonventionen der Name der Klasse lauten sollte 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. Die Koordinaten von Rechtecken sind derzeit nicht definiert, sodass sie sich nicht schneiden (der Vergleich kehrt immer zurück false). Sie erstellen nur r1und r2ohne etwas zu definieren. Sie sollten sie mit dem Konstruktor initialisieren new Rectangle(int x, int y, int width, int height).

  2. Eine Möglichkeit besteht darin, ein Klassenfeld zum Speichern der Koordinate des Rechtecks ​​zu erstellen und deren Koordinate wiederholt zu überprüfen, um festzustellen, ob sie kollidieren.