在我的JPanel中BackGround,我该如何解决这个问题?

时间:2014-04-26 10:08:35

标签: java swing jpanel intersect

我的问题是,我让星星随着一个线程移动,它们移动垂直并且它运行良好但是我为该星做了一个随机的X,有时它会像这样与其他星星交叉:

enter image description here

enter image description here

这是我JPanel的代码:

上课后台移动

public class Backgroundmoving extends JPanel {
    ArrayList<starmoving> star;

    public Backgroundmoving() {
        this.setSize(650, 501);
        star = new ArrayList<>();
        for (int i = 0; i < 20; i++)
            this.addStar();
    }

    public void addStar() {
        int x, y;

        x = (int) (Math.random() * 625);

        y = (int) (Math.random() * 476);

        starmoving e = new starmoving(x, y);
        star.add(e);
        Thread t = new Thread(e);
        t.start();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        draw(g);
    }

    public void draw(Graphics g) {
        g.drawImage(new ImageIcon("background.png").getImage(), 0, 0, 650, 501, null);
        for (int i = 0; i < star.size(); i++) {
            star.get(i).draw(g);
        }
        repaint();
    }

    public static void main(String[] args) {
        // TODO code application logic here
        JFrame gui = new JFrame();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(650, 510);
        gui.setResizable(false);
        gui.add(new Backgroundmoving());

        gui.setVisible(true);
    }

}

上课 starmoving

public class starmoving implements Runnable {

    int x;
    int y;
    int yVel;

    public starmoving(int x, int y) {
        this.x = x;
        this.y = y;
        yVel = 1;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    private void move() {
        y += yVel;
        if (y > 476) {
            y = 0;
            x = (int) (Math.random() * 625);
        }
    }

    private boolean isOffScreen() {

        if (y <= 476)
            return false;
        return true;
    }

    public void draw(Graphics g) {
        g.drawImage(new ImageIcon("star.png").getImage(), x, y, 12, 12, null);
    }

    @Override
    public void run() {
        while (true) {
            move();

            try {
                Thread.sleep(7);
            } catch (InterruptedException ex) {
                System.out.println(ex.getMessage());
            }

        }
    }

}

1 个答案:

答案 0 :(得分:0)

  

我不希望星星交叉,在随机X之前想到一个if但是我怎么知道其他星是否在那个X中?

你有一个包含所有“StarMoving”对象的ArrayList。因此,您需要遍历该列表以确保没有任何对象相交。

除此之外,您还有其他问题。

  1. 使用正确的Java类名称。 Java类应该以大写字符开头。 (即“眩光”是错误的)

  2. 不要为动画使用多个线程。您当前的代码启动20个线程。你应该有一个Thread,然后迭代你的ArrayList来移动所有星星。

  3. 不要在draw()方法中读取图像。目前你的代码是每7ms读取一次图像。这不是很有效。图像应该被读取一次,然后存储为您班级的属性。