刚自学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]
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]
楼主说的这种“闪烁”是否是指tank移动有跳动的感觉?
是否是因为每次位移过大的原因
楼主把每次位移单位改小,
然后加快repaint频率试试呢
不要每次都repaint全部
而是只repaint画面上的脏区域(有变化的区域)
这个需要自己来靠算法控制了
当然,这个说起来容易,做起来难
真正能把这一点做到很好
那就已经是大牛级别了,呵呵