我所知道坦克大战(单机版)之解决坦克碰撞时穿透问题、发射超级炮弹、添加坦克生命值

本章目的

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

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


我们发现目前当两坦克碰撞在一块的时候,会直接穿透过去根据上一个思路回到原位置,我们能否进行更加智能一些?当坦克相撞也回到原位置?

class Tank{

    //坦克与坦克碰撞的方法
    public boolean collideWithTank(List tanks){
        for (int i=0; i

同时我们在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();
        //省略其他关键性代码....
    }
    
    //省略其他关键性代码....
}

这下我们的就可以完成超级炮弹的发射了,你看敌方坦克瑟瑟发抖了

image.png

步骤总结

按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);
        
        //省略其他关键性代码....
    }
    //省略其他关键性代码....
}

image.png

步骤总结

显示坦克生命值
  • ✧ Tank类添加坦克生命值
  • ✧ 击中坦克添加不同阵营的击中处理
  • ✧ TankClient显示出坦克生命值

参考资料


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

你可能感兴趣的