解决坦克停下来也可以打出炮弹:画出炮筒,在fire中把子弹方向给炮筒
1.创建坦克炮筒常量并初始化:
private Direction ptDir = Direction.D;
2.在draw方法里面画出炮筒
public void draw(Graphics g) {
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(x, y, WIDTH, HEIGHT);
g.setColor(c);
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();
}
3,虽然画出了炮筒,但是炮筒方向不随坦克运动改变,所以有以下代码
if(this.dir!=Direction.STOP){
this.ptDir = dir;
}
4.在fire方法中修改dir为ptDir
public Missile fire(){
int x=this.x+Tank.WIDTH/2-Missile.HEIGHT/2;
int y=this.y-Missile.WIDTH/2+Tank.HEIGHT/2;
Missile m = new Missile(x, y, ptDir);
return m;
}
总结:炮筒的创建是很有必要的,炮筒的方向是通过坦克move改变的,在fire方法中传ptDIR实现了炮筒的方向就是子弹打出的方向。
下面是坦克类代码:
public class Tank {
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;
int x,y;
private boolean bL=false,bU=false,bD=false,bR=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 tc){
this(x,y);
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);
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();
}
void move(){
switch(dir){
case L: x -= XSPEED;break;
case LU: x -= XSPEED; y -= XSPEED;break;
case U: y -= XSPEED;break;
case RU: x += XSPEED;y -= XSPEED;break;
case R: x += XSPEED;break;
case RD: x += XSPEED;y += XSPEED;break;
case D: y += XSPEED;break;
case LD: x -= XSPEED;y += XSPEED;break;
case STOP: break;
}
if(this.dir!=Direction.STOP){
this.ptDir = dir;
}
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_CONTROL: tc.m = fire(); break;
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) {
int key = e.getKeyCode();
switch(key){
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.HEIGHT/2;
int y=this.y-Missile.WIDTH/2+Tank.HEIGHT/2;
Missile m = new Missile(x, y, ptDir);
return m;
}
}