版本:一颗子弹击中敌方坦克——面向对象思维分析
是否打中:hatTank方法;(游戏中碰撞检测,有些复杂,一般直接调用库方法)在这里我们应用碰撞类:getRect(返回值Rectangle)
1.子弹类中加入方法:
public Rectangle getRect(){
return new Rectangle(x, y, WIDTH, HEIGHT);
}
public boolean hitTank(Tank t){
if(this.getRect().intersects(t.getRect()) )
return true;
}
return false;
}
public Rectangle getRect(){
return new Rectangle(x, y, WIDTH, HEIGHT);
}
2.在坦克类中定义生死量:
private boolean live = true;
public void setLive(boolean live){
this.live = live;
}
如果不是生的,不画坦克 if(!live){
return;
}
public void draw(Graphics g) {
if(!live){
return;
}
Color c = g.getColor();
if(good){
g.setColor(Color.RED);
}
else{
g.setColor(Color.blue);
}
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.出现子弹没有消失的情况,和打死坦克的情况。 移除子弹,把代码放在画之前,这样判断更加合理,如果没有 live不用画
子弹类;
if(!live){
tc.missiles.remove(this);
return;
}
public boolean isLive() {
return live;
}
public boolean hitTank(Tank t){
if(this.getRect().intersects(t.getRect()) && t.isLive()){
t.setLive(false);
this.live=false;
return true;
}
return false;
}
总结:首先构造hitTank方法,坦克和子弹类中都引入getRect(),如果碰撞了,子弹和坦克都要消失,引入live,并构造方法,最后在主类中调用 m.hitTank(enemyTank); 实现一颗子弹击中敌方坦克。
下一版本:加入爆炸类。