关于java:我所知道坦克大战单机版之添加爆炸效果击毙坦克后产生爆炸

55次阅读

共计 1976 个字符,预计需要花费 5 分钟才能阅读完成。

本章目标

  • 增加爆炸成果
  • 击毙坦克后产生爆炸

一、增加爆炸成果


咱们想在增加一个爆炸的成果,那么个别爆炸成果是怎么做到的呢?

其实与子弹一样,也是画进去的,先是小爆炸到大爆炸,完后又小爆炸隐没

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

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 办法即可,能够看到刚刚创立的爆炸成果从小到大、再到小而后隐没状态

步骤总结

  • ✧增加爆炸类
  • ✧退出 live
  • ✧退出地位属性
  • ✧退出 draw 办法

二、击毙坦克后产生爆炸


这时咱们有一个想法:当咱们击中坦克的时候,坦克就会沦亡,若有多个坦克,则须要多个子弹能力击毙完,那么咱们在若只有一个爆炸成果的话,当击毙完一个坦克的时候呈现一次,那么第二个坦克怎么办呢?

这时咱们是不是也须要将爆炸的成果也应用一个汇合治理与子弹匹配上

public class TankClient extends Frame {
    
    // 治理多个爆炸的成果
    List<Explode> explods = new ArrayList<Explode>();
    
    @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;
    }
    // 省略其余关键性代码....
}

这时咱们击中坦克就能够产生了爆炸的成果

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

class Explode{

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

步骤总结

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

参考资料


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

正文完
 0