塔防P3 炮塔跟踪和攻击

塔防游戏 第三集

本集主要实现了炮台跟踪和攻击敌人的逻辑。

炮台跟踪

炮台监控和设计控制的代码段比较长,新建一个自建积木来存放代码段。在创建时将积木设置为运行时不刷新屏幕可以改善性能表现。

我们需要在炮台布置之后监控敌人。在上节课选择判断炮塔是否跟随鼠标的代码段那里,把原本的如果那么判断改成如果那么否则判断,在否则中执行炮台监控。因为判断外层套了循环,里面就不再需要嵌套循环了。

为了实现对敌人的监控和攻击,需要一系列的变量:

  • 私有变量目标敌人编号:存放经过一系列判断后,最终选择的攻击目标的编号。
  • 私有变量检查敌人编号:遍历敌人编号列表的迭代器。
  • 私有变量检查敌人编号ID:当前检查到的敌人编号值。
  • 私有变量炮塔与敌人的距离:存放炮塔与当前检查到的敌人的距离。
  • 私有变量最远敌人进度:存放炮塔与当前射程内进度最快(离终点最近)的敌人的距离。
  • 全局变量攻击范围:存放炮塔最远的攻击距离,在本体初始化。

初始化时,把目标敌人编号设置为空,意为没有目标。检查敌人编号设置为0,每次遍历开始时这个变量会自增1,所以是从1开始遍历的。最远敌人进度设置为-999,保证至少有一名敌人的进度可以被存放在这个变量中。
注意最远敌人进度必须要初始化,否则可能会出现之前判断存放的值影响新的判断。

每次执行监控,对整个敌人编号列表里所有的编号进行遍历,把检测敌人编号ID更新为每次遍历到的敌人编号,之后计算敌人与炮塔的距离,当敌人同时满足在炮塔的攻击范围内,且进度比之前存放的目标敌人更快,就把目标敌人编号更新为当前遍历到的敌人编号。

如何测量敌人到炮塔的距离?我们的第一反应可能是“侦测”中的到敌人的距离,但是这个距离给出的值是到母体的距离而非克隆体。
为了测量敌人到克隆体的距离,我们新建一个自建积木计算炮塔与敌人距离。在这个积木中需要两个变量,为敌人X轴坐标敌人Y轴坐标。这两个变量在积木调用时赋值。
两点间距离的计算方式是直角三角形边长公式的变体。直角三角形边长公式为:\(a^2*b^2=c^2\)
我们要求的距离为敌人和炮台的直线距离d,即为斜边长c,直角边a和b可以通过对炮台和敌人x,y轴坐标相减得到,可得:\(d=\sqrt{(x_2-x_1)^2*(y_2-y_1)^2}\)

接下来完成炮塔旋转的功能。在敌人判断结束后,如果找到了需要攻击的目标敌人编号,那么就让炮塔面向敌人所在的角度。角度的计算公式推导需要用到向量的知识,直接放结论了:

\[\theta = \arctan\frac{y2 - y1}{x2 - x1} \]

对于敌人在炮台左边和右边两种情况需要分开处理。

炮台攻击敌人和敌人死亡销毁

接下来实现炮台对敌人的攻击。我们新建一个私有变量是否攻击,来进行是否进行攻击操作的判断。初始化克隆体时,将其设置为no,当经过判断射程内是否有敌人后目标敌人编号不为空,即判断到了需要攻击的敌人,就把是否攻击设为yes。

接下来对敌人进行处理。除了碰到地图边缘删除外,还要在进度被设置为dead时销毁。

测试发现炮塔顺利的跟踪并攻击了敌人,但是敌人并没有消除。发现是敌人数据更新太快覆盖了我们的修改,我们要求敌人只在进度不是dead的情况进行更新,当进度为dead时直接数据置空并销毁。

这样就可以正常的攻击并消灭敌人了。

炮台平滑跟踪的实现

这个视频里没有,但是方法其实很简单:把侦测和攻击的代码段分开执行就可以了。

总结

本次课程完成了炮台的跟踪和攻击,并且处理了敌人的死亡销毁。在编程过程中使用了一些难度较高数学知识来处理敌人距离和面向角度的逻辑。在编程,尤其是算法编写中是建立在数学基础上的,离不开数学知识。对数学知识的掌握和理解程度很大程度上影响了算法的实现能力和运行效率。

posted @ 2025-03-20 09:31  AnzioNiko  阅读(177)  评论(0)    收藏  举报