《超级宏官方教程》第三章·第5节:宏控制 —— 主稿:楚玄枫
第三章·第5节:宏控制主稿:楚玄枫宏控制首先恭喜读者你跳过/看懂了前面的人写的乱七八糟的东西,进入到了这个小节。 注意:这个小节的部分内容需要你能够了解前面大部分内容,并且有一定的宏基础的情况下再仔细研读。本小节主要要针对的内容,是如何控制宏的各语句运行。 由于众所周知的原因,初涉写宏的新人经常会发现,在不必要的时候打了不必要的技能,技能顺序混乱,或者出于输出的需要要调整一部分技能的顺序,这些需求会越来越多。本节将要讲的,是如何应用超级宏的函数,对这些进行控制。
1.顺序控制由于众所周知的原因,超级宏的代码是逐行运行的。例如:Code 1-1
/skill [条件A]技能A
/skill 技能B
/skill 技能A
那么宏在执行的时候会首先判断:如果满足了条件A,那么执行技能A(当然这里会有一个合法释放的前提,如果技能A不能被释放,那么自然不会释放);然后顺序执行下一行,执行技能B,再下一行,执行技能A,结束。但是事实上,如果技能A和技能B之间有公共CD,那么技能B和后续的技能A均会被公共CD限制,从而,一旦执行成功一个技能,那么后面的技能会进入公共CD而无法执行。顺序控制在宏的写作过程中,都已经被有意识的应用于宏的各个角落,但毫无疑问,通过调整语句顺序来控制技能顺序,是控制中最简便的一种。然而,大多数情况下,当我们遇到问题时,简单的顺序控制无法达成其应有的效果。
2./if顺序控制的原理,是各技能之间有公共CD,通过公共CD使技能不能发动而达成限制后续技能执行,从而达到控制执行顺序的问题。然而,并非所有的技能都与大部分技能公共CD。每个门派都或多或少有一些非常重要但没有公共CD的技能,包括特效腰坠的使用也是没有公共CD的。此外,如果在引导读条中通过宏发动了非引导读条技能,那么会中断引导读条。如上例,若技能A是一个引导读条技能,那么假如条件A是真,技能A的读条会一闪而逝,因为其读条被技能B的执行强制打断。另有一些情况下,简单的使用顺序调整,无法达到控制技能发动的目的,此时,/if就会派上用场。与/if相配合的是/else(/elseif)和/end。使用/if可以简单的控制一个技能序列是否在指定的条件下执行,同时可以使用/if来合并多个相同条件的技能的使用。例如:以下语句用来实现,只在条件1下执行这些技能序列:Code 2-1/if [条件1]/skill 技能A/var v_参数A/skil 技能B/print /end
以下是一个技能序列:Code 2-2
/skill [条件1]技能A
/skill [条件1,条件3]技能B
/skill [条件1,条件2,条件3]技能C
/skill [条件1,条件4,!条件3]技能D
/skill [!条件1,条件2]技能B
/skill [!条件1,条件3]技能D
上面的技能序列可以使用/if合并为:Code 2-3/if [条件1]/skill 技能A/skill [条件3]技能B/skill [条件2,条件3]技能C/skill [条件4,!条件3]技能D/else/skill [条件2]技能B/skill [条件3]技能D/end
3.更多的/if使用/if,可以简单的为多个技能或技能组合划定发动条件,同时使我们的宏看上去高端大气上档次了很多。如果有必要,可以在/if里面再用一个/if。例如,上面的code 2-3还可以写作:Code 3-1/if [条件1]/skill 技能A/if [条件3]/skill 技能B/skill [条件2]技能C/else/skill [条件4]技能D/end/else/skill [条件2]技能B/skill [条件3]技能D/end
唯一需要注意的是,每使用一个/if,都要有一个/end与之对应,同时注意与/if对应的/else(/elseif),以免产生不必要的逻辑错误。
4./return/return从作用上来讲,相当于一个/if:只要满足/return的条件,在这个/return之后的所有语句都不会再执行。最常见的用法当属众所周知的/return ,用来保护读条的语句。
5./var变量可以使宏变化多端,这并不是随便说说。变量分两种,一是在头部定义的控制变量,二是在宏中直接定义的宏变量。这两者在使用时并没有太大区别,唯一区别是控制变量可以由使用者在宏面板上任意改变。使用变量来控制一个技能的执行,如下例:Code 5-1#name 测试#varbool v_变量A,tip:这是一个变量/skill 技能A/skill 技能B
这是一个完整的宏,通过调整面板上变量开关,可以使宏执行,或不执行技能A。当然,我们也可以这样复杂一点:Code 5-2#name 另一个测试#varnum v_等级,6,tip:只是一个等级/if /var v_test/else/var v_test/end/skill 技能A/skill 技能B/skill 技能C/skill 技能D/skill 技能E
这个宏定义了一个v_等级的变量,此外,我们还在宏内容中定义了一个变量v_test,该变量被赋予true与false两种值,通过这些变量计算不同的条件真假,判断不同技能的执行。需要注意的是,数字型变量当单独作为条件时,只要拥有确切的数值,不论数值是多少,一概认为条件成立。
6.顺序控制/var系列命令,与/skill系列命令所不同的一点,就是所有的/var都会被忠实的执行。因此,不同的顺序对变量的影响是十分大的。Code 6-1#name 变量测试/print /print /var v_a/print /print /if /var v_a/print /var v_b/end/print /print /var v_b
这是一个完整的宏,可以通过切换打坐与否,测试观察两个变量的不同变化,进而理解语句顺序对变量值的影响。实际使用中,在使用变量约束技能条件出现问题时,可以通过在影响变量的语句前后分别写一个/print来测试变量的值是否与预计的值不同。需要注意的是,即使变量语句在宏的末尾,变量的值也是会被记录并影响到下一次宏的执行的,因此,有些情况下可以通过将变量赋值放在语句执行后面来影响循环。从上面的例子里,最后的/var v_b对下个循环的影响就可以看出来。
7./if+/var由于/var的特点是不加约束就会被执行,那么当我们需要限制/var使之不执行时,就需要使用/if(当然,使用/return也是可以的)来限制变量的运行。6-1就是一个限制运行的很好的例子,它限制了只有在打坐情况下才改变v_a和v_b的值。
页:
[1]