共计 2657 个字符,预计需要花费 7 分钟才能阅读完成。
本章目标
- 解决坦克相撞穿透问题
- 发射超级炮弹
- 增加坦克生命值
一、解决坦克碰撞时穿透问题
咱们发现目前当两坦克碰撞在一块的时候,会间接穿透过来依据上一个思路回到原地位,咱们是否进行更加智能一些?当坦克相撞也回到原地位?
class Tank{ | |
// 坦克与坦克碰撞的办法 | |
public boolean collideWithTank(List<Tank> tanks){for (int i=0; i<tanks.size();i++) {Tank t = tanks.get (i); | |
// 相撞时两辆坦克不是统一 | |
if(this != t) { | |
// 要求:两辆坦克都存活并且方框进行碰撞到一块 | |
if (this.live && t.isLive() && this.getRect().intersects(t.getRect())) { | |
// 各自回到原来的地位; | |
this.stay(); | |
t.stay(); | |
return true; | |
} | |
} | |
} | |
return false; | |
} | |
// 省略其余关键性代码.... | |
} |
同时咱们在 TankClient 办法让敌方坦克进行坦克与坦克碰撞的解决
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.collideWithTank(tanklist); | |
tank.draw(g); | |
} | |
// 省略其余关键性代码.... | |
} | |
// 省略其余关键性代码.... | |
} |
这时咱们运行起来游戏窗口就能够实现不会穿梭的问题了,更像是一起磋商的状况
步骤总结
当坦克碰撞到 Tank 时 stay 办法
- ✧ 两坦克不相等
- ✧ 两坦克都存活并且碰撞到一块
二、发射超级炮弹
目前咱们的坦克只能一发一发的发射炮弹感觉不是很爽,能不能按下 A 键时向八个方向都发射炮弹?
首先咱们思考一下,当咱们按下 A 键时八个方向都发射炮弹,那就有相干的键盘事件、方向数组的解决
咱们先增加对某一方向发射炮弹的解决形式
class Tank{ | |
// 增加朝某一方向发射炮弹 | |
public Missle fire(Direction dir){ | |
// 如果坦克沦亡了不用发射子弹 | |
if(!live){return null;} | |
// 依据坦克的坐标地位、方向、传给子弹 | |
// x 坐标 = (坦克的 x + 坦克 w /2) - 子弹 v /2 | |
int x = (this.x + WIDTH / 2) - Missle.WIDTH/2; | |
// y 坐标 = (坦克的 y + 坦克 h /2) - 子弹 n /2 | |
int y = (this.y + HEIGHT / 2) - Missle.HEIGHT/2; | |
// 坦克发射炮弹的时候,携带本人的营垒标识 | |
Missle missle =new Missle(x,y,dir,tc,camp); | |
tc.missles.add(missle); | |
return missle; | |
} | |
// 省略其余关键性代码.... | |
} |
接着咱们依据思路增加超级炮弹的解决形式
class Tank{ | |
// 增加八个方向发射炮弹的办法 | |
private void superFire() {Direction[] dirs = Direction.values(); | |
//i<8 是因为 STOP 方向在第九个地位,它无需发射炮弹 | |
for (int i = 0; i < 8; i++) { | |
// 将八个方向都发射炮弹 | |
fire(dirs[i]); | |
} | |
} | |
// 坦克键盘抬起监听器 | |
public void keyReleased(KeyEvent e) {int key = e.getKeyCode(); | |
switch (key) { | |
case KeyEvent.VK_A: | |
superFire(); | |
break; | |
} | |
locateDirection(); | |
// 省略其余关键性代码.... | |
} | |
// 省略其余关键性代码.... | |
} |
这下咱们的就能够实现超级炮弹的发射了,你看敌方坦克瑟瑟发抖了
步骤总结
按 A 键发射超级炮弹
- ✧ 键盘抬起事件增加 A 键解决
- ✧ fire 发射办法增加方向解决
- ✧ 八个方向循环进行 fire(去除 STOP 方向)
三、增加坦克生命值
当初咱们领有了超级炮弹的 A 键,然而敌方坦克发射炮弹打中咱们,咱们被碰到一下就沦亡了,感觉太不经打了咱们能不能加个生命值给它?
个别咱们的生命值都是 100 左右,每次炮弹击中时减去相应的挫伤即可
class Tank{ | |
// 增加坦克生命值 | |
private int liveHp = 100; | |
public int getLiveHp() {return liveHp;} | |
public void setLiveHp(int liveHp) {this.liveHp = liveHp;} | |
// 省略其余关键性代码.... | |
} |
当咱们的坦克被击中的时候,给予判断并且减去相应的炮弹挫伤,以及生命值清空解决
class Missle{public boolean hitTank(Tank t){ | |
// 要求:指标坦克是活的、不同营垒的、子弹与坦克碰撞一块 | |
if(t.isLive() && t.isLive() && this.getRect().intersects(t.getRect()) && this.camp != t.isCamp()){ | |
// 如果是营垒好的坦克 | |
if(t.isCamp()){ | |
// 以后生命值减去炮弹的挫伤 | |
t.setLiveHp(t.getLiveHp() - 20); | |
// 增加坦克生命值判断 | |
if(t.getLiveHp() <=0){t.setLive(false); | |
} | |
}else{ | |
// 如果营垒是坏的坦克则间接沦亡 | |
t.setLive(false); | |
} | |
this.live = false; | |
// 爆炸成果产生在与子弹产生碰撞的中央 | |
Explode e = new Explode(x,y,tc); | |
tc.explods.add(e); | |
return true; | |
} | |
return false; | |
} | |
// 省略其余关键性代码.... | |
} |
同时咱们在游戏窗口将以后咱们的坦克生命值显示进去,这样更清晰明了
public class TankClient extends Frame { | |
@Override | |
public void paint(Graphics g) {g.drawString("tank liveHp:" + mytank.getLiveHp()+"",10,80); | |
// 省略其余关键性代码.... | |
} | |
// 省略其余关键性代码.... | |
} |
步骤总结
显示坦克生命值
- ✧ Tank 类增加坦克生命值
- ✧ 击中坦克增加不同营垒的击中解决
- ✧ TankClient 显示出坦克生命值
参考资料
尚学堂:坦克大战(马士兵老师)
正文完