求助!反弹球问题(模拟气泡屏保)

hniyani 2010-07-13 04:36:04
有个问题想请教大家 我想写一个模拟的那种气泡屏保的程序 我想实现 单击鼠标就多一个球出来 但是不知道为什么始终只能有一个球出现 敬请大侠解惑 代码如下:
package homeWork;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JApplet;

public class Ball extends JApplet implements Runnable {
private static final long serialVersionUID = 1L;

private Thread blueBall[]=new Thread[20];
private boolean xUp, yUp, bouncing;// 标记是否撞墙,小球是否开始运动
private int x, y, xDx, yDy;// x,y的增量
private final int MAX_X = 200, MAX_Y = 200;// applet的大小
private boolean direction[]= {true,false};//方向数组
private int count=0;//计数器

public void init() {
xUp = direction[(int)(Math.random()*2)];//初始方向随机
yUp = direction[(int)(Math.random()*2)];
xDx = 1;
yDy = 1;
bouncing = false;

addMouseListener(new MouseListener() {// 监听鼠标事件
public void mousePressed(MouseEvent event) {// 按下鼠标
// createBall(event);// 创建小球
}

public void mouseExited(MouseEvent event) {
}

public void mouseClicked(MouseEvent event) {
createBall(event);
count++;
}

public void mouseReleased(MouseEvent event) {
}

public void mouseEntered(MouseEvent event) {
}
});

setSize(MAX_X, MAX_Y);
}

private void createBall(MouseEvent event) {
if (blueBall[count] == null) {
x = event.getX();
y = event.getY();
blueBall[count] = new Thread(this);

bouncing = true;
blueBall[count].start();// 开始线程
}
}

public void stop() {
for (int i = 0; i <=count ; i++) {
blueBall[i] = null;
}

}

public void paint(Graphics g) {
super.paint(g);

if (bouncing) {
g.setColor(Color.blue);
g.fillOval(x, y, 10, 10);
}
}

public void run() {
while (true) {
try {
blueBall[count].sleep(20);// 等待其他准备工作
} catch (InterruptedException exception) {
// TODO: handle exception
System.err.println(exception.toString());
}

// 确定小球的方向
if (xUp == true)
x += xDx;
else
x -= xDx;

if (yUp == true)
y += yDy;
else
y -= yDy;

// 确定下一步
if (y <= 0) {
yUp = true;
yDy = (int) (Math.random() * 5 +1);//避免出现重复在两个位置对弹
} else if (y >= MAX_Y - 10) {
yDy = (int) (Math.random() * 5 +1);
yUp = false;
}

if (x <= 0) {
xUp = true;
xDx = (int) (Math.random() * 5 + 1);
} else if (x >= MAX_X - 10) {
xDx = (int) (Math.random() * 5 + 1);
xUp = false;
}

repaint();
}
}
}

好像,一单击,之前的线程就中断了。
...全文
395 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddxiaolong 2010-07-29
  • 打赏
  • 举报
回复
楼主你好,能不能把你解决后的这个程序给我发一份啊,我学习急用,在找这方面的材料,如果方便的话麻烦您给我发一下好吗?
这是我的邮箱:dxiaolong@126.com
谢谢你哦!!
hniyani 2010-07-18
  • 打赏
  • 举报
回复
非常感谢大家的关注,此问题,在大家的帮助下,已经得到了基本的解决,谢谢大家
tieguaili23 2010-07-17
  • 打赏
  • 举报
回复
这个有意思 ,关注中……
  • 打赏
  • 举报
回复
sleep 小睡2000毫秒
dr_lou 2010-07-16
  • 打赏
  • 举报
回复
封装画小球的方法,点击鼠标的时候调用。
速度控制可以通过sleep吧。
hniyani 2010-07-16
  • 打赏
  • 举报
回复
可否再问一下,这个怎么控制速度啊?
xizhouchen 2010-07-16
  • 打赏
  • 举报
回复
用个集合类,保存小球。然后在paint方法中用循环把所有小球画出来
hniyani 2010-07-14
  • 打赏
  • 举报
回复
可是这个怎么解决呢?
closewbq 2010-07-13
  • 打赏
  • 举报
回复
每次repaint();只是重新画下小球。不会出现多个的。
g.setColor(Color.blue);
g.fillOval(x, y, 10, 10);

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧