现版本粒子仿真系统主要由六个类组成,即界面,监听器,线程,粒子对象,数组队列。界面是最基本,没有特别的,这里不再赘述。
线程里面的死循环体负责不断产生粒子并加入导队列中,而且负责将队列里面的粒子画出。
这里我采用了缓冲区来对画出来的图像以及背景进行处理,因为我觉得通过不断重绘背景来对已经画出的粒子轨迹进行擦除,会让粒子效果看上去更好。
//创建缓存区域
BufferedImage buff;
Graphics buffG;
我之前是将生成小球的死循环体写在监听器里面,但是出现了一个问题,监听器在不断运行,就不能触发窗体关闭的方法了,所以关闭不了窗口……然后将循环体放在线程里面,解决掉了这个问题。
@Override
public void run() {
// TODO Auto-generated method stub
//System.out.println("click");
buff = new BufferedImage(2400,1200,BufferedImage.TYPE_4BYTE_ABGR);
//获取缓存区域的画布
buffG = buff.getGraphics();
ImageIcon im = new ImageIcon(this.getClass().getResource("Sea.jpg"));
while(true)
{ //不断创建小球并添加到数组队列
cd c = new cd();
c.g = g;
c.x = a;
c.y = b;
MA.add(c);
//画出背景图覆盖粒子轨迹
buffG.drawImage(im.getImage(), 0, 0, 2400, 1200, null);
//画出队列里面的小球
for(int i=0;iif(MA.get(i)!=null){
//小球的运动轨迹是基于上一个坐标而随机变化的
MA.get(i).x += (int)(Math.pow((-1),(int)(Math.random()*2))*(int)(Math.random()*25));
MA.get(i).y += (int)(Math.pow((-1),(int)(Math.random()*2))*(int)(Math.random()*25));
//小球的颜色也在随机变化
Color co = new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255),200);
//先画在缓冲区
buffG.setColor(co);
buffG.fillOval(MA.get(i).x, MA.get(i).y, 10, 10);
try{
Thread.sleep(4);
}catch(InterruptedException ef){
}
}
}
//再将缓冲区的图像画到目标画布上
g.drawImage(buff, 0, 0, null);
try{
Thread.sleep(20);
}catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这里监听器MouseMotionListener的作用很简单,就只是用来获取鼠标移动的实时坐标,没有写其他方法
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
x = e.getX();
y = e.getY();
//将坐标传给线程,改变小球位置
thread.a = x;
thread.b = y;
}
其实核心就是上面两个类了,另外的数组队列,我自己写了一个接口,用来定义数组的方法,方便我添加小球(不用定义数组大小,直接改变),这个其实是之前学数组队列的时候用的,后来也就习惯了一直用自己写的这个接口,还没用过系统给的那个。
package GIS07;
public interface ArrList {
//增加元素
public void add(cd e);
//获取元素
public cd get(int index);
//遍历输出元素
public void reveal();
//删除元素
public void delete(int index);
//修改元素
public void update(int index,cd newValue);
//获取大小
public int size();
//清空列表
public void clear();
//插入元素
public void insert(int index,cd e);
//合并列表
public void union(ArrList list);
}
这个project的最终目标是实现粒子方针,有鱼群和捕食鱼群的大鱼,大鱼通过搜索鱼群的位置来移动,而鱼群也通过判断大鱼的方向和距离来移动,所以,未完待续……