我想在Panel上随机停止圈子,但我的圈子不会停止和改变

时间:2017-04-25 15:09:14

标签: java swing random

我是Java新手。我想为我的项目制作简单的agario游戏。但我有一个问题。我想在Panel上随机停止圈子,但我的圈子不会停止和改变。

问题是我认为计时器。

class TestPanel extends JPanel implements ActionListener{
TestPanel(){
    Timer t = new Timer(50,this);  
    t.start();
}

Random rnd = new Random();


int r = rnd.nextInt(256);   
int b = rnd.nextInt(256);
int gr = rnd.nextInt(256);

Color randomColor = new Color(r,b,gr);

Ellipse2D.Double ball = new Ellipse2D.Double(0, 0, 40, 40);   
double v = 10;  
public void paintComponent(Graphics g){
    super.paintComponent(g); 

    Graphics2D g2 =(Graphics2D)g;


    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);


    g2.setColor(Color.RED);
    g2.fill(ball);    

    int NumOfCircles = 70;  
    int diameter;
    int x, y;


    Graphics2D g3 =(Graphics2D)g;



    for(int count = 0; count < NumOfCircles; count++){
        diameter = rnd.nextInt(10);
        x = rnd.nextInt(600);
        y = rnd.nextInt(620);
        g3.setColor(randomColor);
        g3.fillOval(x, y, diameter, diameter);
    }

    }


@Override
public void actionPerformed(ActionEvent arg0) {
    Point p = getMousePosition();
    if(p==null) return;
    double dx = p.x - ball.x - 20;
    double dy = p.y - ball.y - 20;
    if(dx*dx+dy*dy >12){
    double a=Math.atan2(dy, dx);
    ball.x += v * Math.cos(a);
    ball.y += v * Math.sin(a);}
    repaint();
}

}

1 个答案:

答案 0 :(得分:0)

问题在于您的绘画代码。当Swing调用绘制逻辑时,您无法控制。因此,绘制代码应该只根据面板的属性绘制对象,而不应该修改属性。

这意味着:

  1. 不要生成随机值是一种绘画方法。

  2. 在班级的构造函数中,您可以生成圆圈并为每个圆圈指定默认大小/位置。然后将该信息存储在ArrayList中。然后在paintComponent()方法中,您只需遍历List并绘制每个圆圈。

  3. ActionListener的{​​{1}}中,您将迭代遍历ArrayList并更新每个Circle的位置。然后在面板上调用repaint(),以便所有圆圈都重新绘制。

  4. 例如,请查看:How to move two circles together in a JFrame from two different classes