本章目标
- 增加妨碍墙
- 敌方坦克无奈穿梭妨碍墙
一、增加妨碍墙
咱们想想怎么增加妨碍墙?妨碍墙的作用有是什么?坦克、子弹与它有什么关系?
个别当咱们对着妨碍墙发射炮弹,子弹与妨碍墙碰撞的话会隐没
以及咱们的坦克挪动的时候,无奈通过妨碍墙,那么依据后面子弹、坦克的思路
咱们的妨碍墙是不是也能够应用面向对象的思路创立进去?
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
参考资料
尚学堂:坦克大战(马士兵老师)