本章目标
- 图形化显示生命值
- 增加性能方块:血包
一、图形化显示生命值
尽管咱们当初在游戏窗口左上角显示了以后的生命值,然而感觉还是将血条显示进去更好一些
那么具体怎么做呢?应用面向对象思维在坦克类定义一个外部类
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对象固定轨迹挪动
参考资料
尚学堂:坦克大战(马士兵老师)