import java.awt.*; import java.awt.event.*; public class TankClient extends Frame { public static final int GAME_WIDTH=800; public static final int GAME_HEIGHT=600; Tank myTank =new Tank(50,50); Image offScreenImage = null; public void paint(Graphics g) { myTank.draw(g);//理解一下面向对象 } public void update(Graphics g) { if(offScreenImage == null) { offScreenImage = this.createImage(GAME_WIDTH, GAME_WIDTH); } Graphics gOffScreen = offScreenImage.getGraphics(); Color c = gOffScreen.getColor(); gOffScreen.setColor(Color.GREEN); gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_WIDTH); gOffScreen.setColor(c); paint(gOffScreen); g.drawImage(offScreenImage, 0, 0, null); } public void lauchFrame() { this.setLocation(400, 300); this.setSize(GAME_WIDTH, GAME_WIDTH); this.setTitle("TankWar"); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); this.setResizable(false); this.setBackground(Color.GREEN); this.addKeyListener(new KeyMonitor()); setVisible(true); new Thread(new PaintThread()).start(); } public static void main(String[] args) { TankClient tc = new TankClient(); tc.lauchFrame(); } private class PaintThread implements Runnable { public void run() { while(true) { repaint(); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } } private class KeyMonitor extends KeyAdapter { public void keyPressed(KeyEvent e) { System.out.println("ok"); myTank.keyPressed(e); } } } import java.awt.*; import java.awt.event.*; public class Tank { public static final int XSPEED =5; public static final int YSPEED =5; private int x,y; private boolean bL=false,bU=false,bR=false,bD=false; enum Direction{L,LU,U,RU,R,RD,D,LD,STOP}; private Direction dir=Direction.STOP; public Tank(int x, int y) { this.x = x; this.y = y; } public void draw(Graphics g) { Color c = g.getColor(); g.setColor(Color.RED); g.fillOval(x, y, 30, 30); g.setColor(c); move(); } void move() { switch(dir) { case L: x -= XSPEED; break; case LU: x -= XSPEED; y -= YSPEED; break; case U: y -= YSPEED; break; case RU: x += XSPEED; y -= YSPEED; break; case R: x += XSPEED; break; case RD: x += XSPEED; y += YSPEED; break; case D: y += YSPEED; break; case LD: x -= XSPEED; y += YSPEED; break; case STOP: break; } } public void keyPressed(KeyEvent e) { int key=e.getKeyCode(); // if(key==KeyEvent.VK_RIGHT) // { // x +=5; // } switch(key) { case KeyEvent.VK_LEFT: bL=true; break; case KeyEvent.VK_UP: bU=true; break; case KeyEvent.VK_RIGHT: bR=true; break; case KeyEvent.VK_DOWN: bD=true; break; } locateDirection() ; } void locateDirection() { if(bL && !bU && !bR && !bD) dir = Direction.L; else if(bL && bU && !bR && !bD) dir = Direction.LU; else if(!bL && bU && !bR && !bD) dir = Direction.U; else if(!bL && bU && bR && !bD) dir = Direction.RU; else if(!bL && !bU && bR && !bD) dir = Direction.R; else if(!bL && !bU && bR && bD) dir = Direction.RD; else if(!bL && !bU && !bR && bD) dir = Direction.D; else if(bL && !bU && !bR && bD) dir = Direction.LD; else if(!bL && !bU && !bR && !bD) dir = Direction.STOP; } }