第十八章 坦克大战2
1.坦克发子弹思路
2.我方发射子弹1
Shot类 子弹
子弹必须要休眠才能呈现出这个射击的效果
Hero类 增加一个射击子弹的功能
MyPanel类 按J就发射
这里还没有画出子弹,只是记录了一下子弹的位置
3.我方发射子弹2
MyPanel类 画出hero射击出的子弹
这里子弹画了一次就没有画了,因为没有重绘(之前那个重绘,是点一下J会出现一个新子弹。目前我们需要的重绘是发射出的那一颗子弹,在路径上面被不断画出)
下面做出改变,加入线程,不然的话paint方法只调用了一次
这里相当于有两个线程,一个在不断改变子弹的坐标,另一个在不停地重绘
HspTankGame03类 启动线程
MyPanel类 重新绘制子弹
4.敌方发射子弹
EnemyTank类 vecter保存多个shot
MyPanel类 给敌人坦克对象初始化一个shot对象
MyPanel类 画出enemyTank所有子弹
5.敌方坦克消失
EnemyTank类 在敌人坦克内加一个判断生死的isLive
MyPanel类 编写判断子弹是否击中敌方坦克的方法
MyPanel类 在run方法中判断子弹是否击中坦克
MyPanel类 判断敌方坦克是否存活,来决定是否画出敌方坦克
这里出现一个问题,我们的子弹没有在击中坦克时消失(击中坦克后,消失的原因是我们没有画出子弹),它到出了边界才真正消失,我们要做出修改,使子弹碰到敌方坦克时就立刻消失
Shot类 调整子弹消失的条件,新增碰到敌方坦克也消失
6.坦克爆炸
Bomb类 炸弹
MyPanel类 在其中使用炸弹显示爆炸效果
在构造器中初始化图片对象
下面在坦克被击中时,在集合bombs中新增加一个炸弹(一个炸弹由三个图片构成)
下面在paint方法中显示炸弹
最后传入图片
此时出现一个问题,我们将一个坦克打爆炸后,在原来的位置再开一炮,它还是会出现爆炸图案。
原因就是我们将敌人坦克拿掉之后,我们没有将敌人的坦克从enemyTank集合中拿掉。
下面做一点修改
7.敌方坦克自由移动
EnemyTank类 新增线程使坦克自由移动
这里必须要休眠一下,不然坦克速度很快,到处乱窜
MyPanel类 启动线程
这里出现了问题,坦克在抽搐前进
因为这里每隔50毫秒,坦克就随机改变方向
EnemyTank类 让坦克保持方向移动一段距离
8.控制坦克移动范围
EnemyTank类 限定敌人坦克移动范围
MyPanel类 限定我方坦克移动范围
9.坦克发多颗子弹
MyPanel类 新增判断子弹是否消失的代码
上面的写法也有问题,我们会发现,当第一个子弹飞出边界后,再点击J,仍然没有子弹飞出,因为虽然这个子弹的线程结束了,但我们new出来的shot并没有消失。
做出以下修改
hero.shot == null表示我们刚开始没有点击J的时候,可以点击J发射第一颗子弹。
hero.shot.isLive表示我们发射的第一颗子弹消失后(遇到敌人坦克或者遇到边界),之后的子弹可以继续发射。
Hero类 新建集合保存我方发射的多颗子弹
当要发射子弹时,我们遍历这个shots集合
MyPanel类 绘制shots集合中的子弹
Hero类 控制面板上面最多5颗子弹
这里出现新的问题,出了第一颗子弹打中敌方坦克会爆炸,其余子弹打中敌方坦克不会爆炸
因为这里我们是用单颗子弹去判断的
MyPanel类 使集合中的子弹打中坦克都可以使敌方坦克爆炸
为了后面的代码一直,将第一条中的扩展部分的代码注释
10.敌方移动发射
EnemyTank类 使敌人坦克可以发射多颗子弹
isLive表示坦克时存活
shot.size()表示坦克之前发射的子弹已经结束了
目前一个坦克一次只能打一发炮弹,如果想要打多发(比如10颗),则
11.我方被击中爆炸
Tank类 新增isLive属性
MyPanel类 编写方法判断敌方坦克是否击中我方坦克
将hitTank方法中,敌方坦克,变为通用的坦克
名字暂且不改了还叫enemyTank
MyPanel类 调用方法
这里出现一个问题,虽然敌方坦克击中我方坦克,发生了爆炸,但我方坦克还是存在的,
所以要做一个判断,决定什么时候才画出我方坦克