线程小球

来源:互联网 发布:2017网络热曲 编辑:程序博客网 时间:2024/06/15 18:09

本文简要介绍了线程小球的思路。

一、小球类

首先建一个小球类,在类的构造函数中生成小球的颜色,速度等属性,将小球存储在类中。

当小球撞到墙壁的时候即弹回,设置两个Boolean变量来存储小球的运动方向,如果小球运动范围超出,则改变Boolean变量的值来实现小球回弹。

public class Ball {

 

    private JPaneljp;

    public int x, y, vx, vy,size;

    private int r, g, b;// 颜色

    private Graphicsgr;

    public boolean addx = true;

    public boolean addy = true;

    private int w,h;

 

    Random rnd = new Random();

 

    public Ball(JPanel jp) {

        x = rnd.nextInt(400);

        y = rnd.nextInt(400);

        vx = rnd.nextInt(10) + 5;

        vy = rnd.nextInt(10) + 5;

        size = rnd.nextInt(21) + 30;

        r = rnd.nextInt(256);

        g = rnd.nextInt(256);

        b = rnd.nextInt(256);

        this.jp = jp;

    }

 

    public void drawball() {

        gr = jp.getGraphics();

        if(jp.getWidth()<w||jp.getHeight()<h){

           x = x*jp.getWidth()/w;

           y = y*jp.getHeight()/h;

        }

        if (addx) {

           x += vx;

        } else {

           x -= vx;

        }

        if (x >=jp.getWidth() - size ||x <= 0) {

           addx = !addx;

        }

        if (addy) {

           y -= vy;

        } else {

           y += vy;

        }

        if (y >=jp.getHeight() - size ||y <= 0) {

           addy = !addy;

        }

        gr.setColor(new Color(r,g, b));

        gr.fillOval(x,y, size, size);

        w = jp.getWidth();

        h = jp.getHeight();

    }

   

}

二、线程

在线程中实现小球的延时画板的重绘和判断小球间的碰撞,即两小球半径和大于两小球圆心距离时,两小球碰撞,交换两小球的运动方向。

public void run(){

        while(ui.getR()){

           g = ui.getGraphics();

           //画背景,必须画在小球之前

           g.drawImage(image.getImage(),imageX, imageY,ui.getWidth(), ui.getHeight(),null);

           g.drawImage(image.getImage(),imageX-ui.getWidth(),imageY, ui.getWidth(),ui.getHeight(), null);

           if(imageX-ui.getWidth()>=0){

               imageX = 0;

           }

           imageX+=2;

           //定时小球

           for(int i = 0;i<newball.size();i++){

               newball.get(i).drawball();

               //判断两小球是否相撞

               for(int j = i+1; j <newball.size(); j++){

               if((newball.get(i).size+newball.get(j).size)>=2*(Math.sqrt(Math.abs(newball.get(i).x-newball.get(j).x)*Math.abs(newball.get(i).x-newball.get(j).x)+Math.abs(newball.get(i).y-newball.get(j).y)*Math.abs(newball.get(i).y-newball.get(j).y)))){

                       temp = newball.get(i).vx;

                       newball.get(i).vx =newball.get(j).vx;

                       newball.get(j).vx =temp;

                       temp = newball.get(i).vy;

                       newball.get(i).vy =newball.get(j).vy;

                       newball.get(j).vy =temp;

                       tem = newball.get(i).addx;

                       newball.get(i).addx =newball.get(j).addx;

                       newball.get(j).addx =tem;

                       tem = newball.get(i).addy;

                       newball.get(i).addy =newball.get(j).addy;

                       newball.get(j).addy =tem;

                   }

               }

           }

           //普通小球

           for (int i = 0; i <ball.length; i++) {

               if (ball[i] !=null) {

                   ball[i].drawball();

               }

               //判断两小球是否碰撞

               for(int j = i+1; j <ui.getnum(); j++){

               if((ball[i].size+ball[j].size)>=2*(Math.sqrt(Math.abs(ball[i].x-ball[j].x)*Math.abs(ball[i].x-ball[j].x)+Math.abs(ball[i].y-ball[j].y)*Math.abs(ball[i].y-ball[j].y)))){

                       temp = ball[i].vx;

                       ball[i].vx =ball[j].vx;

                       ball[j].vx =temp;

                       temp = ball[i].vy;

                       ball[i].vy =ball[j].vy;

                       ball[j].vy =temp;

                       tem = ball[i].addx;

                       ball[i].addx =ball[j].addx;

                       ball[j].addx =tem;

                       tem = ball[i].addy;

                       ball[i].addy =ball[j].addy;

                       ball[j].addy =tem;

                   }

               }

           }

           try{

               Thread.sleep(40);

           }catch(Exception ex){}

        }

}

三、线程的暂停与继续

此处有两种方法,一种方法为设置一个判断语句,当判断语句为真的时候用continue跳出循环。接下来重点介绍另一种方法。

控制线程的运行的时候常见的规则如下:

1、当需要暂停时,干脆让线程的run方法结束运行以释放资源(实际上就是让该线程永久结束)。

2、线程需要继续时,新开辟一个线程继续工作。

可通过改变run方法中的while循环的条件来控制线程的运行。

四、定时小球

新创建一个进程,通过进程的延时来控制新的小球的生成。

Java中有实现定时器效果的类:

1、定时器所作的具体工作类:java.util.TimerTask。

2、定时器活动控制类:java.util.Timer。

public void run(){

        while(ui.getR()){

           Ball ball = new Ball(ui);

           newball.add(ball);

           try {

               Thread.sleep(1000);

           } catch (InterruptedException e) {

               // TODO Auto-generatedcatch block

               e.printStackTrace();

           }

        }

       

}

1 0
原创粉丝点击