本章目标

  • 解决坦克相撞穿透问题
  • 发射超级炮弹
  • 增加坦克生命值

一、解决坦克碰撞时穿透问题


咱们发现目前当两坦克碰撞在一块的时候,会间接穿透过来依据上一个思路回到原地位,咱们是否进行更加智能一些?当坦克相撞也回到原地位?

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显示出坦克生命值

参考资料


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