我是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();
}
}
答案 0 :(得分:0)
问题在于您的绘画代码。当Swing调用绘制逻辑时,您无法控制。因此,绘制代码应该只根据面板的属性绘制对象,而不应该修改属性。
这意味着:
不要生成随机值是一种绘画方法。
在班级的构造函数中,您可以生成圆圈并为每个圆圈指定默认大小/位置。然后将该信息存储在ArrayList中。然后在paintComponent()方法中,您只需遍历List并绘制每个圆圈。
在ActionListener
的{{1}}中,您将迭代遍历ArrayList并更新每个Circle的位置。然后在面板上调用repaint(),以便所有圆圈都重新绘制。
例如,请查看:How to move two circles together in a JFrame from two different classes