java项目之——坦克大战20

本版本:添加两堵墙。

1.在主类中:墙对象

Wall w1 = new Wall(100, 200, 20, 150, this), w2 = new Wall(300, 100, 300, 20, this);
        hitWall()子弹打墙
for (int i = 0; i < missiles.size(); i++) {
			Missile m = missiles.get(i);
			m.hitWall(w1);
			m.hitWall(w2);
			m.draw(g);
			m.hitTanks(tanks);
			m.hitTank(myTank);
		}
坦克撞上墙后应该停止然后向别处运动

for(int i=0; i<10; i++){
	        Tank t = tanks.get(i);
	        t.collidesWithWall(w1);
	        t.collidesWithWall(w2);
	        //t.collidesWithTanks(tanks);
	        t.draw(g);
	    }
    	w1.draw(g);
    	w2.draw(g);
		myTank.draw(g);	
		

2.在子弹类中:hitwall() 如果子弹撞上墙,则不存活。

public boolean hitWall(Wall w) {
		if(this.live && this.getRect().intersects(w.getRect())){
			this.live = false;
			return true;
		}
		return false;
		
	}



3.在坦克类中:

为了解决坦克撞墙后的运动问题:设置两个变量记录坦克前一位置,每次撞上墙后,坦克会找到前一个位置,然后离开。

private int oldX,oldY;

修改构造方法

	public Tank(int x,int y,boolean good){
       this.x=x;
       this.y=y;    
       
       this.oldX=x;
       this.oldY=y;
       this.good=good;
   }
//在移动前给前位置坐标赋值

move()中在开始给oldX和oldY赋值

void move(){
       this.oldX=x;
       this.oldY=y;
       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;
       } 

 
  

坦克撞墙的方法 ,一旦撞上就会调用stay()

public boolean collidesWithWall(Wall w) {
        if(this.live && this.getRect().intersects(w.getRect())){
            this.stay();
            return true;
        }        
        return false;
    }   

 
  

stay()方法即是返回上一位置的方法

private void stay() {
        
        x = oldX;
        y = oldY;
        
    } 

 
  

总结:对于墙的处理:首先创建,然后子弹对墙,最后坦克对墙。坦克对墙的处理,使用了stay() 运用上个位置让子弹运动离开的方法很合理。

下个版本:坦克不能相互穿越。

 
  

你可能感兴趣的:(java后台--稳健)