跟着元气学编程【18】:盾牌的回复与自动瞄准

2021/10/22369 浏览综合
上一期加入了数值并还原了显示的状态栏。但是盾牌是一次性的,而且子弹只能在X轴左右发射。这导致我在测试的时候50局只赢了2局
TapTap
在我们增加新功能前,我决定先把已经持续了三个版本的bug修了。
TapTap
(这个bug离谱在它不是每次都会触发,而且VS给的异常辅助器是错的 :()
这个异常的名字应该叫“ZeroDivisionError”。所以可以直接在出bug的代码中用try-except-finally语句来捕捉异常后处理
try和except部分
TapTap
finally部分
TapTap
目前算是把bug修好了。接下来就把盾牌回复功能完成。仔细观察原版,可以发现盾牌减少后有一段时间的冷却,之后盾牌就会快速回复直到满值
TapTap
我目前的想法是在Man类中用两个属性存储时间。self.time1是盾被击破后重新回复的冷却时间,self.time2是每个盾牌回复的间隙
TapTap
self.time1开始读条的条件一定是盾牌减少。目前来说,被怪物击中后一定会掉盾,所以可以把控制开始读条的“开关”放在检测怪物子弹的函数中。至于最好模拟开关的东西,当然就是布尔值变量
TapTap
你会发现出现了一个update_armor()函数,而这就是实现控制盾牌的主函数。由于功能和怪物子弹没有关系,我就把它独立封装成了个新函数
TapTap
可以去测试一下,确认无误后再写下一个功能
emmm...我也不知道这个间隔对不对,就凭感觉吧
TapTap
至于自动瞄准,我本来感觉和怪物的差不多,可以直接把相关代码复制过来改点东西就行了
TapTap
但是我寻思着好像不完全对。怪物的目标永远只有一个,而自动瞄准锁定的目标应该是当前距离最近的怪物,所以一直都在变。所以编程变成了数学课:两点之间哪条线最短?在思考无果后,我决定直接上网找现成的公式
TapTap
非常好理解,那就套公式吧。在bullet中写一个方法,用于获得当前距离最近的敌人
TapTap
然后再写一个方法,具体跟怪物子弹代码一样
TapTap
把得到的数据在update()方法中调用
TapTap
再把调用相关方法等乱七八糟的步骤完成
TapTap
终于把一堆参数传完了。现在就可以看成品了
(草,过了,泪目)
当然也可以看出来还有很多问题。怪物子弹有时会停在原地,打着打着移动到下面就会切换场景,自动瞄准不太自然,而且没有打击反馈……这些都是下期的事了。现在我要享受请假学校运动会后快乐的假期
TapTap
8
4