我正在研究旧的多线程弹跳球问题。到目前为止我已经完成了所有设置,但是我想在两个球碰撞时添加爆炸动画。我有碰撞检测,我可以显示发生碰撞的文本,但我想知道最好的模块化方法来创建一个小动画(例如,像素在点周围爆炸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>();
}
}
提前致谢
答案 0 :(得分:2)
你必须做的一件事是从绘图方法中获取程序逻辑,这里是paintComponent
方法。您在此方法中进行了碰撞检测,从此方法中删除集合中的逻辑项,甚至在完全完成其主要作业之前返回该方法 - 即绘制所有组件。
相反,我建议你更多地沿着MVC或模型 - 视图 - 控制器线重新安排你的程序,其中球的状态由模型类保持,游戏循环由控制器类控制,其中碰撞检测完成在控制器中使用模型的状态,以及GUI类,&#34;查看&#34;不保留任何程序逻辑,只显示模型的状态。