java简单动画效果的实现(2)

本文介绍了在Java中如何实现简单的动画效果,特别是弹球移动的扩展。内容涉及两种伪随机数生成方式,包括Math.random()和自定义种子的Random类。在弹球动画扩展部分,讨论了如何通过随机速度改变移动方向,以及优化重绘过程,避免边界问题和闪烁现象。提出了使用双缓冲技术和统一线程管理进行高效动画更新的方法。
摘要由CSDN通过智能技术生成

简单的java随机数
java两种随机数生成方式(均为伪随机):
1.Math.random() 生成0-1之间的随机数,取0不取1;
2.

Random ra=new  Random(x);
int result=ra.nextInt(y);

x是种子,给的种子相同每一次生成的随机数序列是相同的,不给的话默认以当前系统时间的毫秒数为种子生成随机数,这种方式可以当成真随机数用。y是最大值,result得到的是0-y之间的随机数,取0不取y。
弹球动画扩展
1.首先是移动方式的扩展,我们分别横竖坐标给一个-5-5之间的随机数作为移动速度,使得弹球可以以随机的方向和速度移动,考虑到边界问题,每次到达左右边界使x方向上的移动速度乘以-1以使其反方向移动。

	Ball(BallMain ballMain,int x,int y,Color color){
		this.ballMain=ballMain;
		this.x=x;
		this.y=y;
		ridi=random.nextInt(10)+20;
		moveX=random.nextInt(5)+1;
		moveY=random.nextInt(5)+3;
		this.color=color;
	}
		public void move() {
		if(x-ridi<0||x+ridi>ballMain.getWidth()) {
			moveX*=-1;
		}
		if(y-ridi<0||y+ridi>ballMain.getHeight()) {
			moveY*=-1;
		}
		x+=moveX;
		y+=moveY;
	}

2.接着是重绘问题,考虑到后续的扩展,像之前那样
(1)画一个球
(2)根据移动方法在移动后的位置画新的球。
(3)用窗体的颜色覆盖原先的球所在的位置。
进行重绘显得不太适用。
这里我们采用
(1)记录下所有球的坐标。
(2)用窗体大小的空白方框覆盖整个窗体,即将所有球擦除。
(3)根据移动函数修改要移动球的坐标。
(4)将所有球重新绘制到窗体上。
的做法重绘。
同时为了避免闪光问题
(1)采用双缓冲,即将所有球画在一张图片上,再将图片绘制到窗体上。
(2)不为每个球单独创建线程,而是创建一个管理所有球的线程进行统一重绘。

public class ControlBall extends Thread{
 private BallMain ballMain;
 private ArrayList<Ball>bArrayList;

 ControlBall(BallMain ballMain,ArrayList<Ball> bArrayList){
 	this.ballMain=ballMain;
 	this.bArrayList=bArrayList;
 }
 @Override
 public void run() {

 	super.run();
 	while(true) {
 				if(image==null) {
 			image=new BufferedImage(ballMain.getWidth(), ballMain.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
 			ig=image.getGraphics();
 		}
 		ig.setColor(ballMain.getContentPane().getBackground());
 		ig.fillRect(0, 0, ballMain.getWidth(), ballMain.getHeight());
 		for(int i=0;i<bArrayList.size();i++) {
 			bArrayList.get(i).draw(ig);
 		}
 		ballMain.getGraphics().drawImage(image, 0, 0, ballMain);
 		for(int i=0;i<bArrayList.size();i++) {
 			//必须先移动,否则会报错
 			bArrayList.get(i).move();
 			bArrayList.get(i).crash(bArrayList);
 		}
 		//ballMain.repaint();上面的代码可以放到主窗体的paint中,然后调用repaint
 		//方法重绘,但是这样的话不要调用super.paint(g);方法,否则会出现闪烁问   //题
 		try {
 			Thread.sleep(100);
 		} catch (InterruptedException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}
 	}
 	
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值