![e170592117331a68822b3818c72c4977.png](https://i-blog.csdnimg.cn/blog_migrate/8859a139a677f30e4a431434d1169be8.jpeg)
![43693d686291a729ee73a64f0e8de0df.png](https://i-blog.csdnimg.cn/blog_migrate/120bf6cdef60766258aab137cecc106f.jpeg)
如上,是一个单位复活的基于war3的we编辑器的T触发器(war3还有jass和lua等语言的触发器,以后再说,本系列先只讲T触发)
war3的T触发器用的语言就像骑砍编辑器魔球的伪代码一样,war3的jass就像骑砍专用的ms语言一样,其实就是把一些功能函数(骑砍里常叫作操作-operation简称op)借助其他的语言环境“翻译”成其他语言的表达。(注:ms只是方便我们写骑砍代码,而实际支持骑砍游戏运行的却是txt码,就像有人用魔球写伪代码或PY码再转txt,但是实际上中间却先通过VB6转译了下)。
所以每一行你可以认为它是一个op。就相当于骑砍header_operation里的op一样(部分事件也可以理解为相当于header_trigger)。
而骑砍制作必读的header文件夹一系列文件就相当于骑砍ms语言单词语法词典。
就拿mission temple文件的格式来说,一个骑砍触发器的格式基本由三个部分组成,可以这样类比war3编辑器的格式(当然也不全是)。
custom_battle_check_defeat_condition = (
1, 4, ti_once, 相当于war3触发器的事件项
[
(main_hero_fallen),
(assign,"$g_battle_result",-1), 相当于war3触发器的条件项,中括号就相当于选项卡
],
[
(call_script, "script_custom_battle_end"),
(finish_mission), 相当于war3触发器的动作项
])
有的时候条件项可以不写内容(但格式不能省),有的时候动作一项中还会出现一系列子条件事件(war3的if句式和骑砍的try句式类似如果发生什么,就怎样的条件状语从句),骑砍和war3都是这样。
比如第一行“任意单位死亡事件”,转成骑砍语言你可以有两种理解(第一种其实是一种错误理解,不过可以说下引出其他内容),第一个理解是所有单位中有人死了会发生怎样的事件,这就是一个循环单位判断的写法。
(try_for_agents, ":cur_agent"), #所有人循环,就相当于你把场上所有人准备瞅一遍,准备找茬,":cur_agent"相当于一个人称代词,就像中文里的“他/她/它”或者“谁”“某人”,只是程序里的“人称代词”种类更多可定义而已,这句中可以理解":cur_agent"为“某些人”
(agent_is_human, ":cur_agent"), #判断场上这些单位是不是人,满足条件的从队列里“站出来”,我再继续排查
(neg|agent_is_alive, ":cur_agent"),#判断你不是活着的即死了,neg就是非,不做这件事,很多操作与neg|搭配就变成了相反的操作
(xxx), #要填的操作待定,可能不止一个。
(try_end),# 固定格式,好让程序知道你循环全体想找茬找到什么程度达到什么目的才罢休。
注:1.以上所有函数或操作(op)都可以在header_operation找到。
2 . 这时候(xxx)位置处就该填动作一项“翻译”出来的骑砍op组了,也就是看起来像是说明事件或条件的op也会写动作一项中。
但其实try_for_agents这种循环语句其实更像war3 T触发的这一类op组,
选取以技能释放目标为中心,半径为500的园范围内满足 匹配单位 存活=True and 匹配单位是技能释放目标 =Flase and 匹配单位是触发单位的拥有者的敌军 =True 的单位做动作
![11d0784978f1676002dc07a2e46257e8.png](https://i-blog.csdnimg.cn/blog_migrate/62fa7425aeceb21914d55d66323c0461.jpeg)
注:一般用在事件项,例如上图群体风暴之锤T触发中动作项的全部op组合。
1.171版本的ms(就像新华字典修正新版本加点新词或词语补充了点新义)后,try_for_agents加入了可设定范围圈参数,这时就更接近war3这个op了。
再结合后面的op看,其实第一种对“任意单位死亡事件”的理解并不合适。
因为整体事件更强调了个体效果和时刻性。所以接下来换种理解。
war3触发器第一行“任意单位死亡事件”转骑砍语言的第二种理解就是:
相当于骑砍ms单词语法词典里header_triggers文件里的:
ti_on_agent_killed_or_wounded = -26.0 #can only be used in module_mission_templates triggers
用于触发器结构中的“事件”一项,意思就是当某人被杀的时候,发生这件事之后,接下来“动作”一项中会引发一系列什么事情。其实header_triggers比较像英语的时间或条件状语从句,即 when xxxx,xxxx.这样的从句,当发生什么事时,接下来你该怎么办。
这种情况就不需要循环,ms语法提供获取死者的id(相当于我说的人称代词),并对这个人进行“动作”项中的op判断与执行。
接下来开始转化“动作项”中的op。
![43693d686291a729ee73a64f0e8de0df.png](https://i-blog.csdnimg.cn/blog_migrate/120bf6cdef60766258aab137cecc106f.jpeg)
触发单位的类型等于山丘之王,war3的单位类型怎么理解呢,就像骑砍所属兵种一样(也不全是,比如如果是代码写活的能运动有思想的场景物体,那可能就是场景物类别了,具体情况具体分析)
(agent_get_troop_id, ":兵种名", ":某人"), # 得到某人的兵种名
(eq, ":兵种名", "trp_山丘之王"), # 如果兵种名等于(是)山丘之王的时候 ,eq是equal英文“等于”的简写,当然骑砍代码里写兵种名要用英文格式。
war3触发器“等待两秒”:这时会发现用第二种对任意单位死亡的理解会更合适,也可以使用计时器或者“事件项”的延时触发(仅适合第二种理解)
使用骑砍常规计时op做法时如下
(store_mission_timer_a,“:时间”),#存储事件发生后的时间量(秒),相当于你按下了手机计时器功能的开始计时键
(eq,“:时间”,2),#当时间量=2时即距这个死亡事件发生过了2秒时。
这时候介绍一下war3 T触发里一个和骑砍很像的计时器功能制作方法。
war3 ydwe编辑器里有个很方便的op叫作逆天计时器,所以这个方法就是逆天计时法。
war3逆天计时器简单讲解和应用到骑砍:
![9660a0c49dcc43cd6dab6f1677d212ad.png](https://i-blog.csdnimg.cn/blog_migrate/99efc6ef3f76d6d1439b4e2b2bdb66fc.jpeg)
上图war3的T触发“新建计时器”到“清除计时器”几行就用到了逆天计时器。
其实就是额外运行一个触发器,每几秒响应一次,导致一个计数用的全局变量(也可以局部变量,看你用在几个触发器)的数值变化,根据该全局变量的数值来间接算出时间过了多久,常用于每隔多久做某同一件事情的循环动作事件。
这怎么用到骑砍呢?so eazy。
骑砍的“事件项” 比如刚开始骑砍触发器格式的例子里举的1, 4, ti_once,,中这个“1”就代表每隔1秒运行一次该触发器事件(当然也可以动作项里直接用store_mission_timer_a)。所以我们也可以设定一个全局变量,放入“事件项”为1,0,0,的骑砍触发器里,利用骑砍里加减计算的op来使全局变量改变,比如运行一次触发器就加1(如果初始值为0)
则在本触发或其他触发器里控制计时触发器的启动条件和应用时机,那计时触发器开始启动时,本例计时使用的全局变量数字是几就表示过了几秒。通过特定条件将全局变量再次设定为初始值,就相当于重置计时器。
当然和store_mission_timer_a的做法各有千秋。
个人觉的在循环动作事件以及模糊时间间隔(即不需要准确知道时间,只需要一个时间久短的效果时),逆天计时法有时会更方便。
以上war3逆天计时器方法的介绍以后在将“war3触发器思想引入骑砍触发器制作”的相关教程中再着重讲解,包括以前我常说的war3编辑器的“马甲思维”
(当然本例的逆天计时法在骑砍触发器本身有类似应用,可以不说成引进这思想)
war3触发器里“镜头平移到触发单位位置”op转骑砍的理解:
主要要用到以下几种op去合成该效果
(agent_get_position, “:触发单位”,pos1), #得到触发单位坐标 对应T触发的“触发单位的位置”
(position_move_y, pos1, 平移量), #单位坐标平移某个数量,坐标调整
(position_rotate_y, pos1, 旋转量),#单位坐标旋转某个数量,坐标调整
(mission_cam_set_mode, 1), #允许镜头离开系统默认镜头位置
(mission_cam_set_position, pos1),#镜头(或叫摄像机)放在你最后调整完的坐标上。
因为war3 T触发该op后面还有个“持续0秒”,所以是mission_cam_set_position,当然你也可以使用mission_cam_animate_to_position来匀速线性移动到设定镜头位置。
当然还要注意war3 T触发这里的镜头移动是一个即时效果而不是永久,也就是说在骑砍触发中你也要考虑镜头移动死亡单位位置后,其他情况下镜头该依据坐标什么变化。
war3触发器里“英雄复活”op转骑砍的理解:
这时候你看header文件夹(语法词典)里常用词组一章operation里的“词组”中没有任何op的注释提到复活字样。
这时候就需要发挥想象找到替代效果,不要纠结什么叫a死了不久又复活了的概念,而是分析a死了不久又复活的效果是什么,就是a死了从战场里虚化消失后,一个活的a的克隆人出现在死亡地点,不仅继承了身份(兵种名)和遗产(a原来的武器装备服装),而且犯了罪还是a承担(杀了人战场结算算a的)等等。
所以问题就变成了上述触发条件满足后,在触发单位死亡的坐标刷出一个与触发单位同兵种的人,然后对这个人设定原触发单位相关的体态特征和关联功能。刷人用set_spawn_position , spawn_agent 这两个op的固定搭配,具体代码就不示范了。
至于war3触发器里“选择触发单位对玩家1”op,其实是指你作为玩家1,满足之前的条件就鼠标控制那个复活的触发单位,就相当于骑砍里常见的战场延续功能继续wasd操作手下其他士兵一样。
实际上游戏里无分你我,其实只要把镜头跟随某人的一个相对位置,并且让这个人的行为响应你的按键等玩家操作,其实这个人就变成了游戏里的“我”。
似不似这样,此处你们可以温习一下武林外传吕秀才反杀姬无命的经典台词:
不!你不知道。你知道吗?你是谁?姬无命吗?不!这只是个名字,一个代号,你可以叫姬无命,我也可以叫姬无命,他们都可以。把这个代号拿掉之后呢?你又是谁
![5cb0ce21c4956987a91cb3646dcac851.png](https://i-blog.csdnimg.cn/blog_migrate/915b3955799b742472034fd1d123afe9.jpeg)
所以最后用吕秀才说死姬无命的经典台词来告诉大家。
游戏里的世界特别是用程序创造游戏里的世界时,一切代号和代名词都是数据合成的表象,如果你只是片面的看到事物之间的表象区别而不探究并注重其内在联系的话,那么就永远只能停留于表面的换皮制作,就像马换皮坐骑一样,因为很多人只是一昧认为骑砍里被骑的就是马,马就是用来骑的这种表面关系,而对骑砍坐骑的正确认识应该是,坐骑就是一个可以被程序控制移动和碰撞并与其它系统建立关联的实体,比如坐骑和人两个系统的联系就是身体部位相对坐标的获取和绑定设置,而常用的马模型换皮的制作坐骑的方法就是因为很多玩家没有学习过骑砍代码时只能利用人和马的现有绑定关系。
所以要完成一样东西的前提就是先学习必要的基础知识。
最后思想上强调一句:看问题先多关注内在联系,少纠结表面区别。