跟着元气学编程【19】:继承简化与瞄准提示

2021/11/13192 浏览综合
今天来解决上一期留下的部分问题。在这之前,我们先把不知道多少期前写的怪物类文件改一下。原本的怪物类很长,每个怪物基本上都有很长的一段代码
TapTap
(缩小N倍后还有最右边的简略图那么长)
当初的我脑子抽了一下……我以为Python只能继承一个类,继承Sprite后就没办法继承别的了。所以就把很多重复的代码写了六遍……
TapTap
直到几周前我决定百度一下,好家伙,Python可以同时继承多个类
TapTap
(多继承相当于一个人有多个父亲,而且都是亲的……)
我决定使用多继承,但是我没有学会……直到我脑子不抽了,我才想起来继承可以传递,只要B类继承带有Sprite的A类就可以实现相当于同时继承两个类的效果。于是之前那么长的代码就简化到了这么点
TapTap
5号怪物是个炮台,不会动,意味着没有update()方法。那就重写覆盖吧
TapTap
现在我们继续看看细节。被瞄准的怪物脚下有一圈红圈,算作被瞄准的提示。接下来就出现了这样一个二选一的猜想:
(1)这个红圈是单独的美术素材,每当怪物状态为“被瞄准”时,就将红圈绘制在相应怪物脚下
(2)每个怪物都有配套的“被瞄准”状态美术素材。当怪物被瞄准时,切换图片
TapTap
无论思考的结果怎样,这个圈都是要画的。最开始我选了第二种,但是这个圈我不会画(?),所以就用了三角形代替
TapTap
(虽然丑了不是一点半点,不过效果一样就行了)
但是吧,效果好像有点怪?
当时在火车上发呆了很久没思路后,我选择直接重来,换成了第一种。(白画了那么多三角形真好🙃)既然要独立出来,就写一个新类
TapTap
重点在这个get_target_enemy()方法中。该方法获取当前距离最近的敌人,并返回敌人实例对象。锁定提示应该在角色攻击前就显示出来,get_rect()方法用来获取最近敌人的坐标,并在update_screen()中绘制
TapTap
(start_flag就是个记录当前是否有敌人存在的布尔值变量)
此时子弹发射的方向也要和被锁定敌人的方向一致。更改bullet类中关于获取敌人坐标的方法,改成传参的方式
TapTap
当周围没有被锁定怪物时会引发AttributeError异常。在try-except代码块后继续添加相应语句
TapTap
(这个异常实际上还在,只是被捕捉后不会报错了。“只要用户看不见bug,不就没有bug了吗”)
因为目标随时都会变,没有办法在子弹发射时顺便调用。那就在game_functions文件中写一个新函数
TapTap
得到的目标在创建子弹时传给子弹
TapTap
自动瞄准这一块算是写完了。最后,稍微改一点细节。我们可以让角色永远面朝被瞄准怪物的方向。
TapTap
(之前就不应该把切换图片和转向写在一起,不好增加内容。现在把方法提到game_functions里算是重构,但是感觉更不对了……重构都能构歪来😕)
最后的最后,修改主循环中的内容
TapTap
最终效果就是这样的(这么短是因为一只手玩很快就死了)
虽然但是,有点烂。粉色怪物不会显示三角因为体积太大了,没办法和其他怪物同步。下周看看有没有办法修好,如果不行就按照原计划开始制作boss的控制AI了。本来想加点障碍物,但是没有射线检测的情况下有点难写。所以我准备把更完整的复原放到Unity里一起做了
说到Unity,773节课已经学到368了。据说学完有就业水平
TapTap
13
2