线程小球
来源:互联网 发布: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();
}
}
}
- 线程小球
- 线程小球
- 线程小球
- 小球与线程
- 小球
- 小球
- 小球
- 小球
- java线程的应用——窗体中会动的小球
- 如何利用线程的生命周期使小球撞墙弹回
- Swing 利用线程来绘制两个运动的小球
- Android中利用Handler在子线程中更新界面--简单的小球上下跳动案例
- Android中利用Handler在子线程中更新界面--简单的小球上下跳动案例
- JAVA学习日志 简单Frame。加载图片,小球的往复运动,线程
- java线程和进程(运用多线程的小球碰撞游戏)
- 称小球
- 找小球
- 小球下落
- JS获取文本框焦点光标位置、选中起始位置、终止位置、选择内容
- C语言实验——数组逆序
- ACDream 1735 输油管道
- POJ2151——Check the difficulty of problems
- hdu 5826 physics (物理数学)
- 线程小球
- 常见小错误补坑系列
- MySql安装后无法启动服务
- AngularJS RootScope 源码分析
- HDU----2955
- JAVA中的并发工具类(三)---CountDownLatch
- 数据结构实验之二叉树七:叶子问题
- elasticsearch--搜索_Java基础使用
- HDOJ 1087 Super Jumping! Jumping! Jumping!