我所知道坦克大战(单机版)之添加爆炸效果、击毙坦克后产生爆炸

本章目的

  • 添加爆炸效果
  • 击毙坦克后产生爆炸

一、添加爆炸效果


我们想在添加一个爆炸的效果,那么一般爆炸效果是怎么做到的呢?

其实与子弹一样,也是画出来的,先是小爆炸到大爆炸,完后又小爆炸消失

我所知道坦克大战(单机版)之添加爆炸效果、击毙坦克后产生爆炸_第1张图片

那么我们用面向对象的思维,那么爆炸的效果也是一个类

class Explode{

    int x;//爆炸的x坐标
    int y;//爆炸的y坐标
    
    TankClient tc;
    public Explode(int x, int y, TankClient tc) {
        this.x = x;
        this.y = y;
        this.tc = tc;
    }
}

对于爆炸的绘画,我们也是与子弹、坦克等有相应的存活、大小、颜色属性

class Explode{
    private boolean live = true;//爆炸存活状态
    //爆炸效果的的直径数组,慢慢变大又慢慢变小
    int[] diameter = {4,7,12,18,26,32,49,30,14,6};
    //直径数组的下标用于区分那种程度
    int step = 0;
    //画出这个爆炸效果
    public void draw(Graphics g){
        //如果是消亡状态则不必画出来
        if(!live){return;}
        //如果当前爆炸程度是最后一个直径
        if(step == diameter.length){
            step = 0 ;
            live = false;
            return;
        }
        //获取默认的颜色Color
        Color c = g.getColor();
        //将爆炸效果为红色
        g.setColor(Color.ORANGE);
        //画一个爆炸的大小
        g.fillOval(x, y,diameter[step],diameter[step]);
        //将原颜色填充回
        g.setColor(c);
        //修改爆炸的直径
        step++;
    }
    //省略其他关键性代码.......
}

同样的,我们需要在游戏窗口里将它调用画出来看看效果怎么样

public class TankClient extends Frame {
    
    //画出爆炸的效果
    Explode explode = new Explode(80,80,this);
    
    @Override
    public void paint(Graphics g) {
        //省略其他关键性代码....
        //画出爆炸效果
        explode.draw(g);
    }
    //省略其他关键性代码....
}

这时我们运行main方法即可,可以看到刚刚创建的爆炸效果从小到大、再到小然后消失状态

我所知道坦克大战(单机版)之添加爆炸效果、击毙坦克后产生爆炸_第2张图片

步骤总结

  • ✧添加爆炸类
  • ✧加入live
  • ✧加入位置属性
  • ✧加入draw方法

二、击毙坦克后产生爆炸


这时我们有一个想法:当我们击中坦克的时候,坦克就会消亡,若有多个坦克,则需要多个子弹才能击毙完,那么我们在若只有一个爆炸效果的话,当击毙完一个坦克的时候出现一次,那么第二个坦克怎么办呢?

这时我们是不是也需要将爆炸的效果也使用一个集合管理与子弹匹配上

public class TankClient extends Frame {
    
    //管理多个爆炸的效果
    List explods = new ArrayList();
    
    @Override
    public void paint(Graphics g) {
        //省略其他关键性代码....
        //画出容器里的爆炸效果
        for ( int i = 0; i < explods.size();i++){
            Explode e = explods.get(i);
            e.draw(g);
        }
    }
    //省略其他关键性代码....
}

现在我想将爆炸的效果用在当我们击毙坦克后产生出来,那么开始优化把

class Missle{

    //当子弹与坦克碰撞时,坦克消亡
    //同时在子弹的位置上发生爆炸效果
    public boolean hitTank(Tank t){
        if(t.isLive() && this.getRect().intersects(t.getRect())){
            t.setLive(false);
            this.live = false;
            //爆炸效果产生在与子弹发生碰撞的地方
            Explode e = new Explode(x,y,tc);
            tc.explods.add(e);
            return true;
        }
        return false;
    }
    //省略其他关键性代码....
}

这时我们击中坦克就可以产生了爆炸的效果

我所知道坦克大战(单机版)之添加爆炸效果、击毙坦克后产生爆炸_第3张图片

有没有发现,我们并没有与子弹一样做移出的操作,这样爆炸效果也会造成积累

class Explode{

    //画出这个爆炸效果
    public void draw(Graphics g){
        //如果是消亡状态则不必画出来
        if(!live){
            //将它从容器里去掉
            tc.explods.remove(this);
            return;
        }
        //省略其他关键性代码....
    }
    //省略其他关键性代码....
}

步骤总结

  • ✧爆炸应成该存在于集合类中
  • ✧TankClient加入集合
  • ✧将集合中的爆炸逐一画出(如果死去就去除)
  • ✧击毙一辆坦克后应产生爆炸(hitTank 产生爆炸)

参考资料


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

你可能感兴趣的