1.在面板类编写方法,判断我方的子弹是否击中敌人坦克,这个方法需要接收Shot对象和enemyTank对象,用于判断是否被击中。
坦克被击中的情况就是子弹的x,y进入了坦克的x,y,即子弹的x,y坐标在坦克的x,y坐标范围内表示坦克被子弹击中。
坦克的上与下,左与右方向x,y坐标范围分别一样,所以可以将坦克被击中的情况细分为两种:
1.坦克上、下方向时,子弹的x坐标大于坦克左上角的x坐标小于坦克左上角的x坐标加40并且子弹的y坐标大于坦克左上角的y坐标小于坦克左上角的y坐标加60,即坦克x<子弹x<坦克x+40且坦克y<子弹y<坦克y+60。
2.二是坦克左、右方向时,子弹的x坐标大于坦克左上角的x坐标小于坦克左上角的x坐标加60并且子弹的y
坐标大于坦克左上角的y坐标小于坦克左上角的y坐标加40,即坦克x<子弹x<坦克x+60且坦克y<子弹y<坦
克 y+40.
被子弹击中后将子弹和敌人坦克的isLive置为false;
2.什么时 候去判断子弹击中敌人坦克?
因为我们不知道什么时候子弹会击中坦克,所以必须将击中坦克的方法放在循环里,又因为面板类的run
方法每隔100毫秒就要重绘面板一次,所以可以放在这里比较合适。
在run方法的while循环里先判断自己坦克的子弹是否存活,如果存活,遍历敌人所有坦克(因为不知道这颗子弹会击中敌人的哪一辆坦克,所以只能遍历),然后把我的子弹和敌人坦克对象传进判断我方的子弹是否击中敌人坦克方法。
3.击中敌人坦克后,坦克消失,应从敌人坦克的集合中删除并且绘制敌人坦克时就不能再绘制这辆坦克,所以绘制敌人坦克时要加判断条件。即当绘制敌人坦克时,首先判断敌人坦克是否存活。只有在存活的情况下,才会进行绘制。
4.现在运行时发现在判断子弹是否击中敌人坦克的代码抛出了空指针异常
查明原因后,发现异常是在 判断自己坦克的子弹是否存活if语句 if (hero.shot.isLive) ,嗷,原来是因为程序刚开始时我没有按下J键,我的子弹没有创建,从而抛出了空指针异常。因此,我们在if语句中再加入条件我的子弹不为空且子弹存活,即if (hero.shot != null &&hero.shot.isLive)
5.击中敌人坦克后,子弹虽然停止绘制,但是子弹线程仍在继续
解决方法:当子弹击中敌人后,也应该结束shot线程,所以在子弹线程退出的条件(在Shot的run方法)加入子弹的isLive(因为在判断我方的子弹是否击中敌人坦克的方法中,敌人坦克被击中后已经将子弹的isLive置为了false)