刚自学Java 不久  尝试写坦克这个项目 现在遇到调用update() 不能解决闪烁现象这问题 望大家帮忙看一下  谢谢哈
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankClient extends Frame {
public final int WIDTH = 800;
public final int HEIGHT = 600;
Image offScreenImage = null;

Tank myTank = new Tank(100,100,50,50,this);

public void lanuchFrame() {
setBounds(250,50,WIDTH,HEIGHT);
setBackground(Color.green);
setVisible(true);
this.addKeyListener(new KeyMonitor());
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
new Thread(new Monitor()).start();
}

public void paint(Graphics g) {
myTank.draw(g);
}

public void update(Graphics g) {
if(offScreenImage == null) {
offScreenImage = this.createImage(WIDTH,HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, WIDTH,HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
 }
   
class Monitor implements Runnable {
public void run() {
while(true){
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

class KeyMonitor extends KeyAdapter {

public void keyPressed(KeyEvent e) {
myTank.keyPressed(e);
}

public void keyReleased (KeyEvent e) {
myTank.keyReleased(e);
}
}






public static void main(String[] args) {
TankClient tc = new TankClient();
tc.lanuchFrame();
}}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
public class Tank {

public  static final int X_SPEED = 10;
public  static final int Y_SPEED = 10;
boolean dL = false,dR = false,dU = false,dD = false;

int x,y,width,height;
TankClient tc;
Directory dir = Directory.STOP;

public Tank(int x, int y, int width, int height, TankClient tc) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.tc = tc;
}

public void draw(Graphics g) {
Color c = g.getColor();
g.setColor(Color.red);
g.fillOval(x, y, width, height);
g.setColor(c);
move();
}
public void move() {
switch(dir) {
case L :
x -= X_SPEED;
break;
case LU :
x -= X_SPEED;
y -= Y_SPEED;
break;
case U :
y -= Y_SPEED;
break;
case RU :
x += X_SPEED;
y -= Y_SPEED;
break;
case R :
x += X_SPEED;
break;
case RD :
x += X_SPEED;
y += Y_SPEED;
break;
case D :
y += Y_SPEED;
break;
case LD :
x -= X_SPEED;
y += Y_SPEED;
break;
case STOP :
break;
}
}

public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_UP:
dU = true;

 break;

case KeyEvent.VK_RIGHT:
dR = true;

 break;

case KeyEvent.VK_DOWN:
dD = true;

 break;
case KeyEvent.VK_LEFT:
dL = true;
 break;


}
locatesDirectory();
}

public void locatesDirectory() {
if(!dL && !dU && !dD && !dR) dir = Directory.STOP;
else if( dL &&! dU && dD &&! dR) dir = Directory.LD;
else if(dL && !dU && !dD && !dR) dir = Directory.L;
else if(!dL && dU && !dD && !dR) dir = Directory.U;
else if(!dL && !dU && dD && !dR) dir = Directory.D;
else if(!dL && !dU && !dD && dR) dir = Directory.R;
else if(dL && dU && !dD && !dR ) dir = Directory.LU;
else if(!dL && !dU && dD && dR  ) dir = Directory.RD;
else if(!dL && dU && !dD && dR  ) dir = Directory.RU;
}

public void keyReleased(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_UP:
dU = false;

 break;

case KeyEvent.VK_RIGHT:
dR = false;

 break;

case KeyEvent.VK_DOWN:
dD = false;

 break;
case KeyEvent.VK_LEFT:
dL = false;
 break;


}
locatesDirectory();
}


}

[code=Java]public enum Directory {
L,LU,U,RU,R,RD,D,LD,STOP
}
[/code]

解决方案 »

  1.   

    楼主似乎已经使用了双缓冲
    楼主说的这种“闪烁”是否是指tank移动有跳动的感觉?
    是否是因为每次位移过大的原因
    楼主把每次位移单位改小,
    然后加快repaint频率试试呢
      

  2.   

    之后你要做的就是减少repaint的范围
    不要每次都repaint全部
    而是只repaint画面上的脏区域(有变化的区域)
    这个需要自己来靠算法控制了
    当然,这个说起来容易,做起来难
    真正能把这一点做到很好
    那就已经是大牛级别了,呵呵