Java swing中爆炸组件的方法?
我正在研究swing中的多线程弹跳球问题。到目前为止,我已经完成了所有设置,但我想添加两个球碰撞时的爆炸动画。我有碰撞检测功能,可以显示发生碰撞的文本,但我想知道创建小型动画的最佳模块化方法(例如,像素围绕点360度爆炸,随时间逐渐消失) 班级结构: 球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(){/} 公
公开课舞会{
私人双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>();
}
}