最近在做马士兵的坦克大战,出现一个BUG,八个方向可以移动,却只有5个方向可以发炮弹。。看了一个小时没看出来。
会用debug的帮我瞧瞧,谢谢。。
TankClient: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;
import java.util.ArrayList;
import java.util.List;class TankClient extends Frame 
{
public static  final int GAME_WIDTH=800;
public static final int GAME_HEIGHT=600;

Tank tank=new Tank(50, 50,this);
List<Missile> missile=new ArrayList<Missile>();//容器来存炮弹

Image offscreenImage =null;

public void paint(Graphics g) {
tank.draw(g);
for(int i=0;i<missile.size();i++)
{
Missile m=missile.get(i);
// if(!m.isLive())missile.remove(m);
// else m.draw(g);
m.draw(g);

}
g.drawString("missile count"+" "+missile.size(), 60, 60);


}  public void update(Graphics g) {
if(offscreenImage==null)
{
offscreenImage=this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
Graphics gofferScreen=offscreenImage.getGraphics();
Color c=gofferScreen.getColor();
gofferScreen.setColor(Color.GREEN);
gofferScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
paint(gofferScreen);
g.drawImage(offscreenImage, 0, 0, null);
}
TankClient ()
{
setBounds(10,10,GAME_WIDTH,GAME_HEIGHT);
setVisible(true);
setTitle("TankWar");
setResizable(false);
setBackground(Color.GREEN);
this.addKeyListener(new KeyMonitor());
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
new Thread(new paintThread()).start();
}

public static void main(String[] args) 
{
new TankClient();

}
private class paintThread implements Runnable
{
public void run() {
while(true)
{
repaint();
System.out.println("现车不停重画");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}

}private class KeyMonitor extends KeyAdapter
{ public void keyReleased(KeyEvent e) {
tank.keyReleased(e);
} public void keyPressed(KeyEvent e) {
tank.keyPressed(e);
}

}

}
Tank:import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
public class Tank {
public Tank(TankClient client, int x, int y) {
super();
this.tc = client;
this.x = x;
this.y = y;
}
public static final int XSPEED=5;
public static final int YSPEED=5;

public static final int WIDTH = 30;
public static final int HEIGHT = 30;

TankClient tc=null;
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;
private Direction ptDir=Direction.D;


public Tank(int x, int y) 
{
this.x = x;
this.y = y;
}
public Tank(int x, int y,TankClient client) 
{
this(x,y);
this.tc=client;
}
public void draw(Graphics g)
{
Color c=g.getColor();
g.setColor(Color.RED);
g.fillOval(x, y, WIDTH, HEIGHT);
g.setColor(c);
//画炮筒
g.setColor(Color.BLUE);
switch(ptDir)
{

case L:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y+Tank.HEIGHT/2);
break;
case LU:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y);
break;
case U:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y);
break;
case RU:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y);
break;
case R:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2,x+Tank.WIDTH, y+Tank.HEIGHT/2);
break;
case RD:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2,x+Tank.WIDTH, y+Tank.HEIGHT);
break;
case D:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2,x+Tank.WIDTH/2, y+Tank.HEIGHT);
break;
case LD:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2,x, y+Tank.HEIGHT);
break;

}

move();
}

public 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;

}

//每次move后根据Tank新的方向确定炮筒的方向
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_UP :
bU = true;
break;
case KeyEvent.VK_RIGHT :
bR = true;
break;
case KeyEvent.VK_DOWN :
bD = true;
break;
}
locateDirection();
}
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
int key = e.getKeyCode();
switch(key) {
case KeyEvent.VK_SPACE:
fire();
break;
case KeyEvent.VK_LEFT :
bL = false;
break;
case KeyEvent.VK_UP :
bU = false;
break;
case KeyEvent.VK_RIGHT :
bR = false;
break;
case KeyEvent.VK_DOWN :
bD = false;
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;
}
public Missile fire() {

int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;
int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;
Missile m = new Missile(x, y, ptDir,tc);
tc.missile.add(m);
return m;
}}Missile:
import java.awt.Color;
import java.awt.Graphics;public class Missile {

public static final int XSPEED=10;
public static final int YSPEED=10;
public static final int WIDTH = 10;
public static final int HEIGHT = 10;

private int x,y;
Tank.Direction dir;

private boolean live=true;

private TankClient tc;

public boolean isLive() {
return live;
}

public Missile(int x, int y,Tank.Direction dir) {
super();
this.x = x;
this.y = y;
this.dir = dir;
}
public Missile(int x, int y, Tank.Direction dir, TankClient tc) {
super();
this.x = x;
this.y = y;
this.dir = dir;
this.tc = tc;
}

public void draw (Graphics g)
{
Color c =g.getColor();
g.setColor(Color.BLACK);
g.fillOval(x, y, WIDTH, HEIGHT );
g.setColor(c);
move();

}
public 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;

}
if(x<0||y<0||x>TankClient.GAME_WIDTH||y>TankClient.GAME_HEIGHT)
{
live=false;
tc.missile.remove(this);
}

}
}