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