Java swing中爆炸组件的方法?

Java swing中爆炸组件的方法?,java,swing,animation,Java,Swing,Animation,我正在研究swing中的多线程弹跳球问题。到目前为止,我已经完成了所有设置,但我想添加两个球碰撞时的爆炸动画。我有碰撞检测功能,可以显示发生碰撞的文本,但我想知道创建小型动画的最佳模块化方法(例如,像素围绕点360度爆炸,随时间逐渐消失) 班级结构: 球 公开课舞会{ 私人双x,y,dx,dy; 私有静态最终int XSIZE=15; 专用静态最终物理尺寸=15; 公共舞会{ //使x,y,dx,dy随机 } public int getX(){/} public int getY(){/} 公

我正在研究swing中的多线程弹跳球问题。到目前为止,我已经完成了所有设置,但我想添加两个球碰撞时的爆炸动画。我有碰撞检测功能,可以显示发生碰撞的文本,但我想知道创建小型动画的最佳模块化方法(例如,像素围绕点360度爆炸,随时间逐渐消失)

班级结构:

公开课舞会{
私人双x,y,dx,dy;
私有静态最终int XSIZE=15;
专用静态最终物理尺寸=15;
公共舞会{
//使x,y,dx,dy随机
}
public int getX(){/}
public int getY(){/}
公共点位置(){
返回新点(x,y);
}
公共无效移动(矩形2D边界){
//执行移动(更改x、y、dx、dy)
}
公共Ellipse2D getShape(){
返回新椭圆
}
公共布尔碰撞(球其他){
if(this.position().distance(other.position())
球组件

public class BallComponent extends JPanel {

    public ArrayList<Ball> balls = new ArrayList<Ball>(); 
    private ArrayList<Color> colors = new ArrayList<Color>(); 
    private ArrayList<Point> explosions = new ArrayList<Point>(); 
    Random rnd = new Random();
    private boolean exploding = false; 

    public void add(Ball b) {
        balls.add(b);
        colors.add(new Color(rnd.nextFloat(),rnd.nextFloat(),rnd.nextFloat()));
}


    public void paintComponent(Graphics g){
        super.paintComponent(g); 
        Graphics2D g2 = (Graphics2D) g; 

        for(int i=0; i<balls.size(); i++){ 
            for(int j=0; j<i; j++){
                if (balls.get(i).collide(balls.get(j))){ 
                    exploding = true;
                    explosions.add(balls.get(i).position()); 
                    balls.remove(i); 
                    colors.remove(i); 
                    balls.remove(j); 
                    colors.remove(j);
                    return; 
                }
            }
            g2.setColor(colors.get(i));
            g2.fill(balls.get(i).getShape());
            if (exploding){
                for (Point p : explosions){
                    g2.drawString("boom", p.x, p.y);
                }

            }

        }
    }

    public void reset(){
        balls = new ArrayList<Ball>(); 
        colors = new ArrayList<Color>(); 
        explosions = new ArrayList<Point>(); 
    }

}
公共类BallComponent扩展了JPanel{
public ArrayList balls=new ArrayList();
private ArrayList colors=new ArrayList();
私有ArrayList=新建ArrayList();
随机rnd=新随机();
私有布尔分解=false;
公共空间添加(球b){
加入(b);
添加(新颜色(rnd.nextFloat(),rnd.nextFloat(),rnd.nextFloat());
}
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;

对于(int i=0;i您必须做的一件事是从绘制方法中获取程序逻辑,这里是
paintComponent
方法。您在该方法中有冲突检测,从该方法中的集合中删除逻辑项,甚至在该方法完全完成其主要工作(即绘制)之前就退出了该方法所有组件

相反,我建议您更多地沿着M-V-C或模型视图控制器行重新安排程序,其中球的状态由模型类控制,游戏循环由控制器类控制,碰撞检测在控制器中使用模型的状态进行,GUI类中的“视图”不包含任何程序逻辑,只显示模型的状态

public class BallComponent extends JPanel {

    public ArrayList<Ball> balls = new ArrayList<Ball>(); 
    private ArrayList<Color> colors = new ArrayList<Color>(); 
    private ArrayList<Point> explosions = new ArrayList<Point>(); 
    Random rnd = new Random();
    private boolean exploding = false; 

    public void add(Ball b) {
        balls.add(b);
        colors.add(new Color(rnd.nextFloat(),rnd.nextFloat(),rnd.nextFloat()));
}


    public void paintComponent(Graphics g){
        super.paintComponent(g); 
        Graphics2D g2 = (Graphics2D) g; 

        for(int i=0; i<balls.size(); i++){ 
            for(int j=0; j<i; j++){
                if (balls.get(i).collide(balls.get(j))){ 
                    exploding = true;
                    explosions.add(balls.get(i).position()); 
                    balls.remove(i); 
                    colors.remove(i); 
                    balls.remove(j); 
                    colors.remove(j);
                    return; 
                }
            }
            g2.setColor(colors.get(i));
            g2.fill(balls.get(i).getShape());
            if (exploding){
                for (Point p : explosions){
                    g2.drawString("boom", p.x, p.y);
                }

            }

        }
    }

    public void reset(){
        balls = new ArrayList<Ball>(); 
        colors = new ArrayList<Color>(); 
        explosions = new ArrayList<Point>(); 
    }

}