上一章节对于科技方面属性的修改作了系统而全面的叙述,这也宣告了属性函数 xsEffectAmount 函数全方位的360度感知体会正式收官。本期作为一篇杂谈,我们将放眼多人联机场景,解决一个在联机场景中很常见但又十分头疼的问题——那就是联机编号ID 的混沌错误现状。让我们一起来拨云见雾,扭转乾坤,寻觅校正的不二法门。
模式篇作为属性函数压轴登场的部分,重要性自然不言而喻。模式篇共有四个篇章,分为青龍、白虎、朱雀、玄武四个子篇章。本篇为读者娓娓道来的是最后一篇玄武篇——科技驰骋--璞玉纵有璧瑕不掩瑜。
本节主要内容是对科技方面属性的修改进行庖丁解牛以及对科技研究函数的使用作了鞭辟入里的分析解读,还有就是对产生单位这一刷兵新方法进行介绍。随着模式篇最后一节的终了,不知不觉中关于xsEffectAmount属性函数超全面叙述的帷幕也缓缓落下。这便是属性函数讲解的全部内容。下一节我们将聚焦联机场景中座位排序问题,如何从混沌中拨乱反正,寻觅真正的光明之路。路漫漫其修远兮,道阻且长上下需求索!
(资料图)
原文“这个条件是恒成立的。”错误。此条件不是恒成立的,有可能为真,也有可能为假。原因是函数会将本函数中调用的最后一个有返回值函数的返回值,作为本函数的返回值返回,虽然由于函数类型是 void,这个返回值不能被一般的函数读取,但它会影响判断条件的成立与否。如果希望此条件恒成立,则将返回值改为 bool,并在函数结束时 return(true); 或其他类似方法,总之,为了防止返回一个未预期的其他中间过程的值,最终自行返回一个值覆盖掉。这个情况类似于汇编中,有的函数不修改 RAX/EAX/AX 等寄存器,当作不返回任何数据,但是主调方却检测 RAX/EAX/AX 作为结果,这就导致了实际上接收到的结果是最后一次有修改该寄存器的函数的赋值。验证上述言论非常简单。新建一个触发,默认是关闭状态,条件是脚本调用bool man() { return(true);}再新建一个触发,默认是开启状态,在屏幕上显示,添加一些简短描述,条件是脚本调用void test() { man(); xcChatData("Hello, World");}如果这个触发的条件真的是恒成立,那么,屏幕上的说明应该划线。但实际上,只要把函数 man 中的返回值改成 false,就会发现这是一个恒不成立条件,屏幕上的说明没有划线。另外,对原文的第 2 条补充一点说明。条件不成立时,才会在下一帧再次尝试调用这个脚本判断条件是否已经成立。如果条件已成立,且本触发中的其他条件都成立,那么效果执行完后,下一帧,若触发不循环或没有再次被其他触发激活,那么条件脚本就不会再被执行了。即,有需要判断触发是否应该被执行效果时,才会判断条件是否成立,才会找到条件中的脚本调用,才会检测脚本的返回值。返回值会被转换为 bool,为真满足,为假不满足
xs 更为底层,xs 中的“玩家”是“玩家 ID”,而不是“玩家颜色编号”。玩家 ID 实际上是玩家在大厅中的座位号,而玩家颜色编号是该玩家选择的颜色中的数字,蓝色不一定就是 1,地编中的玩家 1 的颜色才一定是 1。官方 xs 和上层之间是有一层转换的,只是这个转换没有公开。如果玩家 ID 和颜色编号不统一,就能发现这种转换,例如在观战时按 Ctrl + Shift + F1,是切换到玩家 ID 为 1 的玩家,而不是玩家颜色编号为 1(默认蓝色)的玩家。这也是单机中无论自己是何种颜色编号,Ctrl + Shift + F1 始终能切换到自己的原因——自己始终是座位 1。在地编中,颜色编号对应的颜色是可以修改的,例如,将玩家 3 颜色改成红色,那么红色就是编号 3。在 xs 出现以前,一切“玩家”都指玩家颜色编号,而不论玩家 ID,即座位号。例如,在大厅中玩家 1 选择了编号 8,此时是蓝色,进入游戏后,就会看到自己名称是蓝色,且玩家名称前有一个蓝色的 8。此时对他生效的触发,是玩家 8 的触发。但 xs 出现以后,更为底层的 API 被允许使用,xs 中的“玩家”不再是“颜色编号”,而是“座位号”,我们称之为“玩家 ID”。在自定义场景中,如果只用 xs,或者只用场景触发,是不会有任何问题的。但如果同时使用两者,座位号和颜色编号的不同会影响到场景逻辑。为方便使用,可建立九个全局变量 p0, p1, p2,..., p8,分别代指玩家 ID 为 0~9 的玩家对应的颜色编号。其值通过场景触发的玩家编号赋予。
思路与马桶游击队帖子中的方法相同,只是考虑到场景触发永远不需要使用玩家 ID,因此并不需要设置触发变量,而是在脚本中定义变量:
然后在场景触发中建立新的触发,九个效果分别是设置玩家 0~8 的某些无用资源为 0~9
最后一个效果调用函数:
xs 的完整代码是:
此后,在脚本中,凡是确定使用玩家 ID 的,直接填写数字,凡是与触发交互的,填写 p1 等,例如xsSetPlayerAttribute(p3, cAttributeGold, 999);将颜色编号为 3 的玩家黄金设置为 999,xsSetPlayerAttribute(2, cAttributeWood, 888);将 ID 为 2 的玩家木材设为 888
附相关的不统一的三类数据玩家 ID玩家在大厅中的座位号,范围 0~8,0 盖亚,1 座位号 1……玩家颜色 ID更改对象颜色等触发使用的值,范围 1~8,1 蓝色,2 红色……颜色 ID指代颜色的索引,范围 0~15,0 蓝色,1 红色……内部的逻辑是玩家 ID 是玩家数据的索引,通过玩家 ID 能够找到玩家类。类中有玩家颜色 ID 成员,这个成员有指向颜色 ID 的成员。xs 直接使用第一项,玩家 ID 索引玩家场景触发使用第二项,玩家颜色 ID 反向索引玩家。第一项与第二项的映射,体现在 xs 与场景触发的不同上。第二项与第三项的映射,体现在玩家颜色的编号和实际颜色的不同上。实际上只有第三项是确定颜色。
标签:
下一篇:最后一页