骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索

弹道模拟系统与add_missile

热度 1已有 67 次阅读2019-6-1 17:52 |个人分类:骑砍杂谈

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
这样你就不用遍历抛射体了

第二种方法,情形处理

就是在发射子弹或者发射炮弹的时候进行单独的模拟运算,而不再由弹道系统统一处理,这样的好处就是一旦子弹和炮弹运行完毕,那么这些弹体就不会再参与模拟运算,而会保持静止,这样无疑会减少计算量

第三种方法,跟踪处理

事先准备一个列表,把需要模拟的抛射体加入到这个列表中,而一旦执行完所需的任务(比如施加伤害,再比如触地爆炸),就把这个抛射体从这个列表移除,而移除之后,那么这个抛射体自然就不会在被弹道系统所处理

路过

鸡蛋
1

鲜花

握手

雷人

刚表态过的朋友 (1 人)

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册(Register!)

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2019-6-27 04:35 , Processed in 0.050843 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部