上一个版本:坦克打出多发子弹;
功能:解决炮弹不消亡的问题,解决坦克出界问题。
子弹打中对方坦克或者出界,定义一个控制生死的变量。
1.定义变量:live
private boolean live =true; //炮弹是否在界面的变量
2.定义tc 并且判断islive, 如果 没有存在就调用移除方法。
private TankClient tc;
public boolean isLive() { //调用isLive()来判断
return live;
}
public void draw(Graphics g){
if(!live){
tc.missiles.remove(this); //如果不在界面则移除
return;
}
Color c = g.getColor();
g.setColor(Color.BLACK);
g.fillOval(x, y, WIDTH,HEIGHT);
g.setColor(c);
move();
}
3.重写构造方法,tc来传入fire。
public Missile(int x, int y,Tank.Direction dir,TankClient tc) {
this.x = x;
this.y = y;
this.dir = dir;
this.tc = tc;
}
4.判断是否在界面内。
if(x<0||y<0||x>TankClient.GAME_WIDTH||y>TankClient.GAME_HEIGHT){ //数学上不在界面的表达
live = false;
}
5.坦克类中修改。
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,this.tc); //this.tc 是使用对方的引用,对子弹进行控制
tc.missiles.add(m);
return m;
}
6.坦克的出界问题相对简单一些:不让坦克出界,在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;
}
//不让坦克出界代码
if(x < 0) x=0;
if(y<0) y=0;
if(x+Tank.WIDTH>TankClient.GAME_WIDTH) x=TankClient.GAME_WIDTH-Tank.WIDTH;
if(y+Tank.HEIGHT>TankClient.GAME_HEIGHT) y=TankClient.GAME_HEIGHT-Tank.HEIGHT;
}
总结:子弹出界和坦克出界两个问题不同处理,再次理解持有对方引用的解决问题的方法。
下一版本:制造出敌方坦克。