本章目标

  • 增加妨碍墙
  • 敌方坦克无奈穿梭妨碍墙

一、增加妨碍墙


咱们想想怎么增加妨碍墙?妨碍墙的作用有是什么?坦克、子弹与它有什么关系?

个别当咱们对着妨碍墙发射炮弹,子弹与妨碍墙碰撞的话会隐没

以及咱们的坦克挪动的时候,无奈通过妨碍墙,那么依据后面子弹、坦克的思路

咱们的妨碍墙是不是也能够应用面向对象的思路创立进去?

class Wall{    int x;//墙的x坐标    int y;//墙的y坐标    int w;//墙的宽度    int h;//墙的高度    public Wall(int x, int y, int w, int h) {        this.x = x;        this.y = y;        this.w = w;        this.h = h;    }}

同时咱们对于墙也是有相应的绘制办法、与包裹成方块的办法

class Wall{    //省略其余关键性代码....    public void draw(Graphics g){        //绘制墙体        g.fillRect(x,y,w,h);    }        //将墙包裹成方框不便碰撞测试    public Rectangle getRect(){         return new Rectangle(x,y,w,h);    }}

当初咱们在TankClinet类中定义一些墙,测试看看是否胜利

public class TankClient extends Frame {        //绘制墙体    Wall w1 = new Wall(100,200,20,150);        @Override    public void paint(Graphics g) {        //画出墙体        w1.draw(g);        //省略其余关键性代码....    }        //省略其余关键性代码....}

步骤总结

建Wall类、建设Wall对象、画进去
让每一颗子弹打击每一堵墙
  • ✧ hitWall( )办法
  • ✧ 留神:子弹速度不能太快,否则很容易穿过墙

二、敌方坦克无奈穿梭妨碍墙


咱们的墙就进去了,然而有一些问题比方:坦克、子弹都能够穿过来

咱们先对子弹进行解决,增加子弹与墙体之间的碰撞办法

public class TankClient extends Frame {        @Override    public void paint(Graphics g) {        public void paint(Graphics g) {        //画出容器里的子弹        for ( int i = 0; i < missles.size();i++){            //将墙体也放进来进行碰撞            m.hitWall(w1);            //省略其余关键性代码....        }        //省略其余关键性代码....    }    //省略其余关键性代码....}class Missle{    public boolean hitWall(Wall wall){        //要求:子弹是未沦亡的并且子弹与墙体的方框碰撞到一块        if(this.live && this.getRect().intersects(wall.getRect())){            this.live = false;            return true;        }        return false;    }     //省略其余关键性代码....}

这时咱们对坦克进行优化与批改,增加与墙的碰撞办法解决

class Tank{    //坦克与墙碰撞的办法    public boolean collideWithWall(Wall wall){        //要求:坦克是未沦亡的并且坦克与墙体的方框碰撞到一块        if(this.live && this.getRect().intersects(wall.getRect())){            //让坦克停下来            this.dir = Direction.STOP;            return true;        }        return false;    }        //省略其余关键性代码....}

咱们能够设置为敌方坦克不可穿过墙体,而咱们的坦克能够领有特权等等

public class TankClient extends Frame {    @Override    public void paint(Graphics g) {        //画出容器里的敌方坦克        for ( int i = 0; i < tanklist.size();i++){            Tank tank = tanklist.get(i);            tank.collideWithWall(w1);            tank.draw(g);        }        //省略其余关键性代码....    }        //省略其余关键性代码....}

这时当咱们的敌方坦克与墙体碰撞的时候,就会停下来不动。感觉不是很好

咱们可不可以当它撞到墙时,让它回到未撞墙的地位呢?

class Tank{    int oldx;//坦克的上一个x坐标        int oldy;//坦克的上一个y坐标    public Tank(int x, int y,boolean camp) {        this.x = x;        this.y = y;        this.oldx = x;        this.oldy = y;        this.camp = camp;    }        void move() {            //每次挪动前记录原来的地位        this.oldx = x;        this.oldy = y;        //省略其余关键性代码....    }        //省略其余关键性代码....}

当咱们的坦克与墙体产生碰撞时,回到上一个地位,就是oldX与oldY

class Tank{    //坦克与墙碰撞的办法    public boolean collideWithWall(Wall wall){        //要求:坦克是未沦亡的并且坦克与墙体的方框碰撞到一块        if(this.live && this.getRect().intersects(wall.getRect())){            //让坦克回到原地位            this.stay();            return true;        }        return false;    }    //回到上一地位    public void stay(){        this.x = oldx;        this.y = oldy;    }        //省略其余关键性代码....}

这时当咱们的中央坦克撞向墙,也能依据上一个地位从新进行挪动了

步骤总结

让敌方坦克不能穿墙:
  • ✧ 记录上一次的地位oldX, oldY
  • ✧ 批改构造函数
  • ✧ 每次move之前纪录上一次地位
  • ✧ 增加stay办法
  • ✧ 记录挪动前的地位
  • ✧ 当撞到时回到挪动前的地位
  • ✧ 当碰到墙的时候stay

参考资料


尚学堂:坦克大战(马士兵老师)