本章目标

  • 图形化显示生命值
  • 增加性能方块:血包

一、图形化显示生命值


尽管咱们当初在游戏窗口左上角显示了以后的生命值,然而感觉还是将血条显示进去更好一些

那么具体怎么做呢?应用面向对象思维在坦克类定义一个外部类

class Tank{    class BloodBar{        public void  draw(Graphics g){            //获取默认的色彩Color            Color c = g.getColor();            //将以后画笔色彩化为色彩            g.setColor(Color.RED);            //画出外层的空心方框            g.drawRect(x,y-10,Tank.WIDTH,10);            g.setColor(Color.ORANGE);            int hp = Tank.WIDTH * liveHp /100;            g.fillRect(x,y-10,hp,10);            //将原色彩填充回            g.setColor(c);        }    }    //省略其余关键性代码........}

这时咱们在绘制坦克的时候呢,将这个类的绘制办法也给绘制进去

class Tank{    private BloodBar bd = new BloodBar();    //增加办法实现坦克的绘画    public void draw(Graphics g) {            //将外部类的血条画进去        bd.draw(g);        //省略其余关键性代码........    }    //省略其余关键性代码........}

接下来咱们运行游戏窗口,看看这个图形化生命值怎么样?好不好玩?

步骤总结

图形化显示生命值
  • ✧ 外部类依据生命值绘制
  • ✧ 绘制坦克时绘制图形化

二、增加性能方块:血包


个别当咱们的坦克被击中后,会扣除相应的生命值

那么能不能像其余游戏一样,在某一个工夫呈现一个物品给我补充血量呢?

这时咱们增加一个性能方块:血包、实现相应的办法并且依照肯定的静止轨迹进行静止

class Blood{    int x;//血块的x坐标    int y;//血块的y坐标    int windth;//血块的宽度    int height;//血块的高度}

咱们同样须要对于血包这个类,实现绝对应的绘制、治理、碰撞等等

class Blood{    //增加办法实现血块的绘画    public void draw(Graphics g) {        //获取默认的色彩Color        Color c = g.getColor();        //将以后画笔色彩化为色彩        g.setColor(Color.MAGENTA);        g.fillRect(x,y-10,windth,height);        //将原色彩填充回        g.setColor(c);    }        //省略其余关键性代码........}

在其余游戏中,个别这种性能方块都会飘来飘去的静止,有以下思路

  • 采纳坦克的思路每个一段时间更换一个方向
  • 依照固定轨迹挪动,并且在一段时间下隐没

咱们将挪动的坐标轨迹应用二维数组治理

class Blood{    //将挪动的坐标信息应用二维数组保存起来    private int[][] pos = {        {350,300},{360,300},{375,275},{400,200},{360,270},{365,290},{340,280}    };    int step = 0;    public Blood() {        //初始化为第一个坐标        x = pos[0][0];        y = pos[0][1];    }    private void move(){        step++;        if(step == pos.length){            step = 0;        }        x = pos[step][0];        y = pos[step][1];                windth = height = 15;    }        //省略其余关键性代码........}

同时给咱们的TankClient增加血块绘制与治理血块挪动

public class TankClient extends Frame {        Blood blood =new Blood();        @Override    public void paint(Graphics g) {        //省略其余关键性代码........        //画出血块        blood.draw(g);    }    //省略其余关键性代码........}class Blood{    //增加办法实现血块的绘画    public void draw(Graphics g) {        move();    }        //省略其余关键性代码........}

这时候咱们运行窗口就能够看到这个性能方块血包再挪动轨迹了

那么接下来咱们就要思考坦克吃掉它的思路了,说白了就是与它碰撞

class Tank{    //增加与血包方块碰撞的办法    public boolean eat(Blood blood){        //要求:坦克是未沦亡的并且坦克与血包的方框碰撞到一块        if(this.live && this.getRect().intersects(blood.getRect())){            //让坦克血量充斥            this.setLiveHp(100);            return true;        }        return false;    }    //省略其余关键性代码........}class Blood{    //创立血包的坐标空间区域    public Rectangle getRect(){        return new Rectangle(x,y,windth,height);    }        //省略其余关键性代码........}

TankClient 增加对吃血包的解决

public class TankClient extends Frame {        @Override    public void paint(Graphics g) {        //省略其余关键性代码........        mytank.eat(blood);    }    //省略其余关键性代码........}

当咱们的坦克与血包进行碰撞的时候,就会补充血量

同时咱们发现只有咱们站在血包的挪动轨迹内,就能够始终死不了

咱们是不是也须要对血包进行存活状态的解决,若是被吃了则隐没

class Blood{    //辨别血包的存活    private boolean live = true;    public boolean isLive() {        return live;    }    public void setLive(boolean live) {        this.live = live;    }    //增加办法实现血块的绘画    public void draw(Graphics g) {                    //若沦亡则不用绘制进去        if(!live){return;}       //省略其余关键性代码........    }    //省略其余关键性代码........}

坦克吃掉血块后,将血块的存活状态改为沦亡

class Tank{    //增加与血包方块碰撞的办法    public boolean eat(Blood blood){        //要求:坦克是未沦亡的、方块未沦亡的,并且坦克与血包的方框碰撞到一块        if(this.live && blood.isLive() &&  this.getRect().intersects(blood.getRect())){            //让坦克血量充斥            this.setLiveHp(100);            //让血包沦亡            blood.setLive(false);            return true;        }        return false;    }    //省略其余关键性代码........}

步骤总结

增加性能方块:血包
  • ✧ 增加Blood类
  • ✧ 增加绘制、挪动、挪动轨迹坐标、存活等属性办法
  • ✧ 让blood对象固定轨迹挪动

参考资料


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