{JAVA} Dikdörtgen çarpışma algılama [kapalı]

Sep 10 2020

** Merhaba arkadaşlar, 2 sorum var.

  1. neden "Hit" kelimesi görünmüyor.
  2. Koduma göre bu 2 yazının çarpışmasını ve birbirini zıplatmasını sağlamak için ne tür bir kod eklemem gerekiyor? Bana bir ipucu vermeniz yeterli. bunu kendim yapacağım. Aşağıda 1. sorunun kodu verilmiştir. Teşekkürler. **

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

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

Yanıtlar

Abra Sep 12 2020 at 06:40

Okumadığın javadoc için no-arg yapıcı sınıfının Rectangle?

Koordinat alanında sol üst köşesi (0, 0) konumunda olan ve hem genişliği hem de yüksekliği sıfır olan yeni bir Dikdörtgen oluşturur.

Bu araçlar r1ve r2sıfır boyutuna sahip ve dolayısıyla onlar kesiştiği olamaz. Sen vermek gerekir r1ve r2bunları oluştururken boyutları. Bu yöntemin fillRect(), sınıfta java.awt.Graphics, ekranın bir bölgesini basitçe boyadığını unutmayın. r1Ve ile ilgisi yok r2. Yani bu iki satırı yöntemde değiştirmelisinizpaintComponent()

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

buna:

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

Sonra kesişecekler.


İkinci sorunuzla ilgili olarak. Yöntemde actionPerformed(), dikdörtgenlerin r1ve r2kesişme noktalarının kesişip kesişmediğini kontrol etmeniz gerekir ve eğer kesişirlerse, hareketin yönünü tersine çevirmeniz gerekir - aynen dikdörtgenlerden biri kenarına ulaştığında yaptığınız gibi JPanel. Bunu yapmak için, yapabilir r1ve r2sınıfının üyeleri f5.

Aşağıdaki kod, her iki isteğinizi de nasıl gerçekleştireceğinizi gösterir, yani dikdörtgenlerin ne zaman kesiştiğini ve kesiştiklerinde birbirlerinden "geri dönmelerini" nasıl sağlayacağınızı belirler.

Yalnızca bir örneğine ihtiyacınız vardır Timer, bu nedenle yöntemde her seferinde yeni bir tane oluşturmamalısınız paintComponent(). Bunu sınıf yapıcısında bir kez oluşturabilirsiniz f5.

Sınıf f5üyelerinin statik üyeler değil, örnek üyeler olması gerektiğini unutmayın . Ayrıca, java adlandırma kurallarına göre , sınıfın adının olması gerektiğini unutmayın 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. Dikdörtgenlerin koordinatları şu anda tanımlanmadığından kesişmezler (karşılaştırma her zaman geri döner false). Sadece yaratıyorsun r1ve r2hiçbir şey tanımlamıyorsun. Bunları yapıcı kullanarak başlatmalısınız new Rectangle(int x, int y, int width, int height).

  2. Bunun bir yolu, dikdörtgenin koordinatını saklamak için bir sınıf alanı oluşturabilir, çarpışıp çarpışmadıklarını görmek için tekrar tekrar koordinatlarını kontrol edebilirsiniz.