摆动摆动部件的方法?

时间:2015-12-02 13:31:34

标签: java swing animation

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

班级结构:

public class Ball {

    private double x,y,dx,dy;
    private static final int XSIZE = 15;
    private static final int YSIZE = 15;

    public Ball(){
        // make x,y,dx,dy random
    }

    public int getX(){//}

    public int getY(){//}

    public Point position(){
        return new Point(x,y);
    }

    public void move(Rectangle2D bounds){
        //do movement (change x,y,dx,dy)
    }

    public Ellipse2D getShape(){
        return new Ellipse
    }

    public boolean collide(Ball other){
        if (this.position().distance(other.position()) < XSIZE)
            return true;
        return false;
    }
}

BallComponent

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

}

提前致谢

1 个答案:

答案 0 :(得分:2)

你必须做的一件事是从绘图方法中获取程序逻辑,这里是paintComponent方法。您在此方法中进行了碰撞检测,从此方法中删除集合中的逻辑项,甚至在完全完成其主要作业之前返回该方法 - 即绘制所有组件。

相反,我建议你更多地沿着MVC或模型 - 视图 - 控制器线重新安排你的程序,其中球的状态由模型类保持,游戏循环由控制器类控制,其中碰撞检测完成在控制器中使用模型的状态,以及GUI类,&#34;查看&#34;不保留任何程序逻辑,只显示模型的状态。