0

超级宏论坛

分类导航全部

温馨提示

站内问题请先查看帮助中心
每一位侠士都有过小白经历,希望大家多一点耐心,互相帮助,江湖有你随行,步步惊(喜)心

发帖说明

  1. 求助类问题请在提问前请先搜索已解决方案,并描述清楚问题。
  2. 宏与工具的提问时请在帖子中“@ 用户名”,以便作者收到通知,否则作者可能无法知晓。
关闭生成文章|
无色幽明 关注 发布时间: 2014-03-26 最后更新: 2014-03-26 25778 0
打印
分享
正序查看
无色幽明 40 认证团队 认证玩家 签约作者 1# 最后更新 2014-03-26
更多 回复
第三章·第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 [true] v_参数A
/skil 技能B
/print [v_参数A]
/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 [ota],用来保护读条的语句。

5./var
变量可以使宏变化多端,这并不是随便说说。变量分两种,一是在头部定义的控制变量,二是在宏中直接定义的宏变量。这两者在使用时并没有太大区别,唯一区别是控制变量可以由使用者在宏面板上任意改变。
使用变量来控制一个技能的执行,如下例:
Code 5-1
#name 测试
#varbool v_变量A,tip:这是一个变量
/skill [v_变量A] 技能A
/skill 技能B

这是一个完整的宏,通过调整面板上变量开关,可以使宏执行,或不执行技能A。
当然,我们也可以这样复杂一点:
Code 5-2
#name 另一个测试
#varnum v_等级,6,tip:只是一个等级
/if [v_等级>3]
/var [true] v_test
/else
/var [false] v_test
/end
/skill [v_等级<2] 技能A
/skill [1<v_等级<4] 技能B
/skill [v_等级+buff:效果A<4] 技能C
/skill [v_等级] 技能D
/skill [v_test,buff:效果A] 技能E

这个宏定义了一个v_等级的变量,此外,我们还在宏内容中定义了一个变量v_test,该变量被赋予true与false两种值,通过这些变量计算不同的条件真假,判断不同技能的执行。
需要注意的是,数字型变量当单独作为条件时,只要拥有确切的数值,不论数值是多少,一概认为条件成立。


6.顺序控制
/var系列命令,与/skill系列命令所不同的一点,就是所有的/var都会被忠实的执行。因此,不同的顺序对变量的影响是十分大的。
Code 6-1
#name 变量测试
/print [v_a]
/print [v_b]
/var [true] v_a
/print [v_a]
/print [v_b]
/if [buff:调息]
/var [false] v_a
/print [0]
/var [true] v_b
/end
/print [v_a]
/print [v_b]
/var [false] v_b

这是一个完整的宏,可以通过切换打坐与否,测试观察两个变量的不同变化,进而理解语句顺序对变量值的影响。
实际使用中,在使用变量约束技能条件出现问题时,可以通过在影响变量的语句前后分别写一个/print来测试变量的值是否与预计的值不同。
需要注意的是,即使变量语句在宏的末尾,变量的值也是会被记录并影响到下一次宏的执行的,因此,有些情况下可以通过将变量赋值放在语句执行后面来影响循环。从上面的例子里,最后的/var [false] v_b对下个循环的影响就可以看出来。

7./if+/var
由于/var的特点是不加约束就会被执行,那么当我们需要限制/var使之不执行时,就需要使用/if(当然,使用/return也是可以的)来限制变量的运行。6-1就是一个限制运行的很好的例子,它限制了只有在打坐情况下才改变v_a和v_b的值。


点击开关回复楼层
没有更多了
请先登录

试一试@用户名 立即召唤神龙 小伙伴会收到通知喔:)无需加好友即可通知到

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则


您当前使用的浏览器版本过低,网站部分功能可能失效,请更换合适的浏览器。了解更多