package com.google.www;import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;public class TankClient extends Frame {
public static final int GAME_WIDTH = 800;
public static final int GAME_HEIGHT = 600;

int x = 50, y = 50;

Image offScreenImage = null;
Tank myTank = new Tank(50, 50, this);
   
    
    List<Missile> Missiles = new ArrayList<Missile>();
    

public void paint(Graphics g) {
g.drawString("missiles count:" + Missiles.size(), 10, 50);

for(int i=0;i<Missiles.size();i++) {
           Missile m = Missiles.get(i);
           m.draw(g);    
        }
myTank.draw(g);
}

public void update(Graphics g) {
if(offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
} public void lauchFrame() {
//this.setLocation(400, 300);
this.setSize(GAME_WIDTH, GAME_HEIGHT);
this.setTitle("TankWar (By:麦麦)");
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 keyReleased(KeyEvent e) {
     myTank.keyReleased(e);
} public void keyPressed(KeyEvent e) {
              myTank.keyPressed(e);
}
}
}

解决方案 »

  1.   

    package com.google.www;import java.awt.*;
    import java.awt.event.KeyEvent;public class Tank {
    private int x,y;

    private static final int XSPEED = 5;
    private static final int YSPEED = 5;
    private static final int WIGHT = 40;
    private static final int HIGHT = 40;

    enum direction {U,RU,R,RD,D,LD,L,LU,STOP};
        private boolean bU = false,bD = false, bL = false, bR = false;
       
        direction dir = direction.STOP;
        direction ptdir = direction.D;
    TankClient tc;


    public Tank(int x, int y) {
    this.x = x;
    this.y = y;
    }
        
    public Tank(int x, int y, TankClient tc) {
            this(x,y);
    this.tc = tc;
    }
    public void draw(Graphics g){
    Color c = g.getColor();
    g.setColor(Color.RED);
    g.fillOval(x, y, WIGHT, HIGHT);
    g.setColor(c);

    switch( ptdir){
    case U:
    g.drawLine(x +Tank.WIGHT/2, y+Tank.HIGHT/2, x +Tank.WIGHT/2, y);
    break;
    case RU:
    g.drawLine(x +Tank.HIGHT/2, y+Tank.WIGHT/2, x +WIGHT, y);
    break;
    case R:
    g.drawLine(x +Tank.HIGHT/2, y+Tank.WIGHT/2, x + Tank.WIGHT, y + Tank.HIGHT/2);
    break;
    case RD:
    g.drawLine(x +Tank.HIGHT/2, y+Tank.WIGHT/2, x +Tank.WIGHT, y + Tank.HIGHT);
    break;
    case D:
    g.drawLine(x +Tank.HIGHT/2, y+Tank.WIGHT/2, x +Tank.WIGHT/2, y+Tank.HIGHT);
    break;
    case LD:
    g.drawLine(x +Tank.HIGHT/2, y+Tank.WIGHT/2, x , y + Tank.HIGHT);
    break;
    case L:
    g.drawLine(x +Tank.HIGHT/2, y+Tank.WIGHT/2, x , y+Tank.HIGHT/2);
    break;
    case LU:
    g.drawLine(x +Tank.HIGHT/2, y+Tank.WIGHT/2, x , y);
    break;
    }

    move();

    }
        
    void move () {
    switch( dir){
    case U:
    y -=YSPEED;break;
    case RU:
    y -= YSPEED;
    x += XSPEED;
    break;
    case R:
    x += XSPEED;
    break;
    case RD:
    y += YSPEED;
    x += XSPEED;
    break;
    case D:
    y += YSPEED;
    break;
    case LD:
    y += YSPEED;
    x -= XSPEED;
    break;
    case L:
    x -= XSPEED;
    break;
    case LU:
    y -= YSPEED;
    x -= XSPEED;
    break;
    case STOP:
    break;
    }
    if(this.dir !=direction.STOP) {
    this.ptdir = this.dir;
    }                                   
    }
    public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
       switch(key) {
       case KeyEvent.VK_LEFT:
       bL = true; break;
       case KeyEvent.VK_RIGHT:
       bR = true; break;
       case KeyEvent.VK_UP:
       bU = true; break;
       case KeyEvent.VK_DOWN:
       bD = true; break;

       }
       Direction();
    }
         

    public void Direction() {
    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;
    } public void keyReleased(KeyEvent e) {
      
    int key = e.getKeyCode();
       switch(key) {
       case KeyEvent.VK_CONTROL:
       fire();  break;
       case KeyEvent.VK_LEFT:
       bL = false; break;
       case KeyEvent.VK_RIGHT:
       bR = false; break;
       case KeyEvent.VK_UP:
       bU = false; break;
       case KeyEvent.VK_DOWN:
       bD = false; break;
       }
       Direction();
    }    public Missile fire() {
         int x = this.x + Tank.WIGHT/2 - Missile.WIGHT/2;
         int y = this.y + Tank.HIGHT/2 - Missile.HIGHT /2;
    Missile m = new Missile(x, y, ptdir);
    tc.Missiles.add(m); return m;
        }
    }
      

  2.   

    package com.google.www;import java.awt.*;import com.google.www.Tank.direction;public class Missile {

    int x,y;
    Tank.direction dir;

    public static final int XSPEED = 5;
    public static final int YSPEED = 5;

    public static final int WIGHT = 10;
    public static final int HIGHT = 10;


      public Missile(int x, int y, direction dir) {
    this.x = x;
    this.y = y;
    this.dir = dir;
    }
      public void draw(Graphics g) {
     Color c =g.getColor();
     g.setColor(Color.BLACK);
     g.fillOval(x, y,WIGHT, HIGHT);
     g.setColor(c);
     move(); 
      }
      private void move() {
    switch( dir){
    case U:
    y -=YSPEED;break;
    case RU:
    y -= YSPEED;
    x += XSPEED;
    break;
    case R:
    x += XSPEED;
    break;
    case RD:
    y += YSPEED;
    x += XSPEED;
    break;
    case D:
    y += YSPEED;
    break;
    case LD:
    y += YSPEED;
    x -= XSPEED;
    break;
    case L:
    x -= XSPEED;
    break;
    case LU:
    y -= YSPEED;
    x -= XSPEED;
    break;
          }  }
    }
      

  3.   


    擦,我专门下载了jre和eclipse帮你调试。
    哈哈哈!(原谅我笑了)。你这代码没有问题,你说的问题是因为Tank和Missile的速度一样,同时移动时,Missile被Tank挡住了,你改一下Missile的速度就好了。
      

  4.   

    你这个问题就那么几种情况:
    键盘事件没有响应,
    键盘事件响应了,但是fire()函数有问题,
    fire没有问题,那就是paint函数的问题。
    一层层查,就好了。