前面已经实现了一个球在一个窗口中随机运动,下面将在前面的基础上实现两个球的随机运动及碰撞,此次的代码中用到的算法参考了Twinsen写的<向量几何在游戏编程中的使用>一文中关于两球碰撞时的算法.程序仍旧有两个类,一个Ball类,一个BallCanvas类,Ball类与前面相同,而BallCanvas类作了修改,修改后的代码如下:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
public class BallCanvas extends Canvas implements Runnable {
private int ballRadius = 40; //球的半径
private int ballAX,ballAY; //当前A,B球的位置
private int ballBX,ballBY;
private double ballAXMoveLength= 7; //A,B球当前速度在X,Y轴上的分速度
private double ballAYMoveLength = 9; //为了减少计算中数据丢失,用double型而不用int型
private double ballBXMoveLength = 6; //
private double ballBYMoveLength = 5; //如果用int型两球最终将停止运动
private Random r;
private boolean move = true; //标志球是否移动
private int screenWidth, screenHeight; //屏幕宽及高
private int ballARX, ballARY; //A球圆心位置
private int ballBRX, ballBRY; //B球圆心位置
public BallCanvas(int screenWidth, int screenHeight){
r = new Random();
ballAX = r.nextInt(screenWidth - 2*ballRadius); //随机初始化A球的初始位置
ballAY = r.nextInt(screenHeight - 2*ballRadius);
do{ //随机初始化B球的初始位置,且确定A球跟B球不发生碰撞
ballBX = r.nextInt(screenWidth - 2*ballRadius);
ballBY = r.nextInt(screenHeight - 2*ballRadius);
}while((int)Ma