最近编写了一个弹球  小事例,可是中间 带来了很多的问题,尤其是当两个求相撞后带来的 模糊效果(有的球会被弹开,原路返回;有的则直接穿过;还有就是会出现像磁力一样的吸引;),其中写了一个覆写了update方法想利用一下缓存,结果画了个花屏。在进行碰撞检测时只是计算了一下球心之间的距离。想画一个3D效果的球,有司马好的建议吗?(除了贴图效果)package Ball;import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class BallFrame extends Frame{ List<BallClass> listBall = new ArrayList<BallClass>(); int x = 50;//坐标
int y = 50;//
int speadx = 1;//速度
int speady = 0;//
int width = 300;//画板大小
int height = 300;//
int radius = 20;//球半径
int ballNum = 3;///产生球的个数
int ballnum = 0;//球的编号
private Graphics g;//
Graphics offScrenImage = null;//缓存
Color c = new Color(50,50,50);  //球的颜色
Random random = new Random();

List<BallClass> listRBall = new ArrayList<BallClass>();


public BallFrame(){
lunchFrame();
}

public void lunchFrame(){
this.setSize(width, height);
//this.setBackground(Color.white);
this.setResizable(false);
this.setVisible(true);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
for(int i = 0; i < ballNum; i++){
c = new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
// BallClass ball = new BallClass(x+1*5,y+i*5,speadx+i,speady+i,c);
BallClass ball = new BallClass(x+i*40,y+i*40,random.nextInt(20),random.nextInt(20),c,radius,i);
listBall.add(ball);
}

new Thread(new draw()).start();
}

/*public void update(Graphics g){
if(offScrenImage == null){
offScrenImage = g.create(0, 0, width, height);
}
repaint();
Graphics2D g2d = (Graphics2D)g;
g2d.drawString("Ball  :"+listBall.size(), 20, 100);

for(int i = 0; i < listBall.size(); i++){
listRBall.add(listBall.get(i));
}

for(int i = 0; i < listBall.size(); i++){
BallClass nball = listBall.get(i);
listRBall.remove(nball);
if(nball.getX() < 5){
 nball.setSpeadx(-nball.getSpeadx());
}
if(nball.getX() > width-10){
nball.setSpeadx(-nball.getSpeadx());
}
if(nball.getY() < 20){
nball.setSpeady(-nball.getSpeady());
}
if(nball.getY() > height-10){
nball.setSpeady(-nball.getSpeady());
}
Shape s = new Ellipse2D.Double(nball.getX(),nball.getY(),nball.getRadius(),nball.getRadius());
g2d.setColor(nball.getC());
g2d.fill(s);
// Rectangle R1 = s.getBounds();
R1.intersects(Rball.getX()-Rball.getRadius(),Rball.getY()-Rball.getRadius(),
Rball.getX()+Rball.getRadius(),Rball.getY()+Rball.getRadius())
for (int j = 0; j < listRBall.size(); j++) {
BallClass RBall = listRBall.get(j);
if (nball.hit(RBall)) { RBall.setSpeadx(-RBall.getSpeadx());
RBall.setSpeady(-RBall.getSpeady()); nball.setSpeadx(-nball.getSpeadx());
nball.setSpeady(-nball.getSpeady());
}
}
nball.setX(nball.getSpeadx()+nball.getX());
nball.setY(nball.getSpeady()+nball.getY());
listRBall.add(nball);
}
}*/

public void paint(Graphics g){
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawString("Ball  :"+listBall.size(), 20, 100);

for(int i = 0; i < listBall.size(); i++){
listRBall.add(listBall.get(i));
}
for(int i = 0; i < listBall.size(); i++){
BallClass nball = listBall.get(i);
listRBall.remove(nball);
if(nball.getX() < 5){
 nball.setSpeadx(-nball.getSpeadx());
}
if(nball.getX() > width-10){
nball.setSpeadx(-nball.getSpeadx());
}
if(nball.getY() < 20){
nball.setSpeady(-nball.getSpeady());
}
if(nball.getY() > height-10){
nball.setSpeady(-nball.getSpeady());
}
Shape s = new Ellipse2D.Double(nball.getX(),nball.getY(),nball.getRadius(),nball.getRadius());
g2d.setColor(nball.getC());
g2d.fill(s);
/*g2d.draw3DRect(nball.getX()-nball.getRadius(),nball.getY()-nball.getRadius(),
nball.getRadius()*2,nball.getRadius()*2, true);*/
Color c = g2d.getColor();
g2d.setColor(Color.white);
g2d.drawString(Integer.valueOf(nball.getBallnum()).toString(), nball.getX()+5, nball.getY()+15);
g2d.setColor(c);
// Rectangle R1 = s.getBounds();
/*R1.intersects(Rball.getX()-Rball.getRadius(),Rball.getY()-Rball.getRadius(),
Rball.getX()+Rball.getRadius(),Rball.getY()+Rball.getRadius())*/
for (int j = 0; j < listRBall.size(); j++) {
BallClass RBall = listRBall.get(j);
if (nball.hit(RBall)) {
/*RBall.setSpeadx(0);
RBall.setSpeady(0);*/
RBall.setSpeadx(-RBall.getSpeadx());
RBall.setSpeady(-RBall.getSpeady()); nball.setSpeadx(-nball.getSpeadx());
nball.setSpeady(-nball.getSpeady());
}
}
nball.setX(nball.getSpeadx()+nball.getX());
nball.setY(nball.getSpeady()+nball.getY());
listRBall.add(nball);
}
}

class draw implements Runnable{
public void run(){
while(true){
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

public static void main(String[] args) {
new BallFrame();
}
}
//定义一个球类package Ball;import java.awt.Color;import MineSweeping.Point;public class BallClass { private int x = 140;//坐标
private int y = 150;//
private int radius = 10;//球半进
private int speadx = 5;//X向 速度
private int speady = 4;//Y 向速度
private int ballnum = 0;//弹球编号
private Color c;

public BallClass(int x, int y, int speadx, int speady,Color c,int radius,int ballnum) {
super();
this.x = x;
this.y = y;
this.speadx = speadx;
this.speady = speady;
this.c = c;
this.radius = radius;
this.ballnum = ballnum;
}

public int getSpeadx() {
return speadx;
}
public void setSpeadx(int speadx) {
this.speadx = speadx;
}
public int getSpeady() {
return speady;
}
public void setSpeady(int speady) {
this.speady = speady;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
} public Color getC() {
return c;
} public void setC(Color c) {
this.c = c;
} public int getRadius() {
return radius;
} public void setRadius(int radius) {
this.radius = radius;
}

public double distance(BallClass o){
return  Math.sqrt((this.getX()-o.getX())*(this.getX()-o.getX()) + 
(this.getY()-o.getY())*(this.getY()-o.getY()));
}

public boolean hit(BallClass b){
if(this.getX()==b.getX()&&this.getY()==b.getY()){
return true;
}else if(this.distance(b) < 3*this.getRadius()){
return true;
}
return false;
}

public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj instanceof Point){
BallClass b = (BallClass)obj;
if(this.x == b.x && this.y == b.y && this.radius==b.radius){
return true;
}
}
return false;
}

public int hashCode(){
return this.x * 100 + this.y*this.radius;
} public int getBallnum() {
return ballnum;
} public void setBallnum(int ballnum) {
this.ballnum = ballnum;
}

}