{JAVA} Détection de collision rectangle [fermé]

Sep 10 2020

** Salut les gars, j'ai 2 questions.

  1. pourquoi le mot "Hit" n'apparaît pas.
  2. quel type de code dois-je ajouter pour que ces 2 règles se heurtent et se rebondissent en fonction de mon code. Donnez-moi juste un indice. Je le ferai moi même. Vous trouverez ci-dessous le code de la question 1. Merci. **

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

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

Réponses

Abra Sep 12 2020 at 06:40

N'avez-vous pas lu le javadoc pour le constructeur no-arg de class Rectangle?

Construit un nouveau Rectangle dont le coin supérieur gauche est à (0, 0) dans l'espace de coordonnées et dont la largeur et la hauteur sont toutes deux nulles.

Cela signifie que r1et r2ont une taille nulle et ne peuvent donc pas se croiser. Vous devez donner r1et r2dimensionner lorsque vous les créez. Notez que la méthode fillRect(), en classe java.awt.Graphics, peint simplement une région de l'écran. Cela n'a rien à voir avec r1et r2. Vous devriez donc changer ces deux lignes dans la méthodepaintComponent()

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

pour ça:

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

Ensuite, ils se croiseront.


Concernant votre deuxième question. Vous devez vérifier, dans la méthode actionPerformed(), si les rectangles r1et se r2croisent et si c'est le cas, vous devez inverser la direction du mouvement - exactement comme vous le faites lorsque l'un des rectangles atteint le bord du JPanel. Pour ce faire, vous pouvez faire r1et les r2membres de la classe f5.

Le code ci-dessous montre comment réaliser vos deux requêtes, c'est-à-dire déterminer quand les rectangles se croisent et les faire "rebondir" les uns sur les autres lorsqu'ils se croisent.

Vous n'avez besoin que d'une seule instance de Timer, vous ne devez donc pas en créer une à chaque fois dans method paintComponent(). Vous pouvez le créer une fois, dans le constructeur de classe f5.

Notez que les membres de la classe f5doivent être des membres d'instance et non des membres statiques. Notez également que selon les conventions de dénomination Java , le nom de la classe doit être 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. Les coordonnées des rectangles ne sont pas définies pour le moment, donc ils ne se croisent pas (la comparaison revient toujours false). Vous créez simplement r1et r2sans rien définir. Vous devez les initialiser à l'aide du constructeur new Rectangle(int x, int y, int width, int height).

  2. Une façon est que vous pouvez créer un champ de classe pour stocker les coordonnées du rectangle, vérifier à plusieurs reprises leurs coordonnées pour voir si elles entrent en collision.