add_missile是战团从1153开始新加的一个新的操作符,它可以手动控制发射弹体,而无需借助item
那么这个操作符实际上就是完成了弹道模拟的操作,虽然是十分简易(估计是使用item发射物品的代码,不过想一想,item发射弹体的时候,应该调用也是游戏引擎里面的弹道模拟的相关代码)
其实这个逻辑其实也能用ms做出来,核心逻辑无外乎spawn_scene_prop,刷出prop instance之后,再控制它的位移,使用抛物线方程,或者其简化版本(比如拿破仑里面的炮弹轨迹实际上不是抛物线,而是简化版,即直线)
但是这里面有个问题
我们刷出prop instance,要想统一管理,一般都是使用 scene_prop_get_instance_num,然后再遍历每一个prop instance,通过每个prop instance绑定的slot获取属性,然后这些属性来移动它们
但是如果抛射体scene prop很多的时候,我们就需要很多次的循环,而且刷出来的scene prop是无法删除的,比如类似下面的代码:
(try_for_range, ":当前抛射体scene prop id","抛射体scene prop定义开始", "抛射体scene prop定义结束")
(scene_prop_get_num_instance, ":num" ":当前抛射体scene prop id"),
(try_for_range, ":当前prop instance id", 0, ":num")
......
(try_end),
如果你还要处理这些抛射体的伤害计算的话,还得写循环,遍历场上agent或者其他scene prop,判断距离,之后再进行伤害计算,很明显,我们的代码的开销是不低的
那么怎么解决呢?最根本的办法当然是使用add_missile(废话),但是这个方法只限于1153之后版本的战团,不再适用之前的(如果你在使用一些老版本的战团,或者是火与剑,比如楼主用的火与剑,火与剑的封建元素少一些,开发mod比较方便点,那这个方法就不适用了)
两种方法:
第一种方法,分开处理
尽管子弹和炮弹的形态是千差万别,但是它们在飞行的过程中,你只会看到一个火点,所以你只需两个scene prop,一个是子弹的scene prop,另一个是炮弹的scene prop
这样你就不用遍历抛射体了
第二种方法,情形处理
就是在发射子弹或者发射炮弹的时候进行单独的模拟运算,而不再由弹道系统统一处理,这样的好处就是一旦子弹和炮弹运行完毕,那么这些弹体就不会再参与模拟运算,而会保持静止,这样无疑会减少计算量
第三种方法,跟踪处理
事先准备一个列表,把需要模拟的抛射体加入到这个列表中,而一旦执行完所需的任务(比如施加伤害,再比如触地爆炸),就把这个抛射体从这个列表移除,而移除之后,那么这个抛射体自然就不会在被弹道系统所处理