怎样编写宏程式啊!
解决时间 2021-06-06 02:19
- 提问者网友:未信
- 2021-06-05 21:07
利用宏程式怎么编椭圆, 圆弧 ,多边形,锣面,不规则图形啊,及计算和设定。知道请说下
最佳答案
- 五星知识达人网友:煞尾
- 2021-06-05 22:12
授人以鱼不如授人以渔。混宏区也有一段时间了,突然决定把自己写宏的经验写出来,希望对想学习写宏德朋友们有点帮助。虽然我相信那些无视搜索功能无视日经贴开口就问的小白们不会看得。但是如果对任何人能有点帮忙我就满足了……
首先,我们应该明白一些宏最基本的特点
1) 宏命令区分大小写。对于简单的/cast,/s之类的貌似无关紧要,但是对于/script的宏,一定要注意大小写!
2) 宏都是英文的……虽然貌似不懂英文也可以写,但是稍微懂一点还是有助于理解宏的。
3) 宏不是外挂。不要想着例如自动冰箭之类的宏,这是不可能的。
4) 宏命令是同时执行但是又分先后。所以触发公共CD的技能后面不能跟其他技能。
5) 宏命令的符号请使用半角。例如,.”不能用“,。
6) 对于有多个返回的命令,需要用例如a,b,c=GetActionCooldown(x),那么a就是开始,b是长度,c是enable。如果不想要后 面的,例如b和c,那么a=GetActionCooldown(x)就可以,如果不想要前面的,例如a,可以用_,b,c= GetActionCooldown(x)
7) 每一个if和do后面都要跟一个end
暂时先想这几个……
然后看看怎么写
宏的结构很简单,if判断,然后then执行。单纯的执行命令,例如
/script UseAction(x)
相当于在任何情况下都执行。
例如
[/quote]/script if UnitName(“楼主”)==“ZealotMtg” then SendChatMessage(“此贴被评分,最近评分记录 威望:10(奇迹)”)[/quote]
那么,要想写出一个宏,首先就必须明白想要做什么。想象当你自己执行这个动作的时候,你的是如何判断的,然后用宏命令来执行即可。
举例来说,经常有人问,盗贼切割宏。想想如果你要放切割,那么怎么做呢?首先是判断有没有切割buff,如果有就继续砍没有就切割
/script if [检查切割的buff] then CastSpellByName(“邪恶攻击”) else CastSpellByName(“切割”) end
然后怎么判断有没有切割buff呢?试想如果是你,怎么判断?看一眼有没有切割的图标。人可以一眼看过去,电脑呢?全部看一遍咯,也就是说
local qg; for i=1,16,1 do b=UnitBuff(“player”,i); if b and string.find(b,”SliceDice”) then qg=1 break; end; end
然后合起来就可以咯
/script local qg; for i=1,16,1 do b=UnitBuff(“player”,i); if b and string.find(b,”SliceDice”) then qg=1 break; end; end; if qg==1 then CastSpellByName(“邪恶攻击”) else CastSpellByName(“切割”) end
写一个很简单,不是么?
了解最基本的方法以后,如何去提高呢?
1/ 看已经有的宏,学习前辈们的经验
2/ 多看看宏命令。不要求背下来(这也不现实),但是大约了解一下有那些命令是可以通过宏做到的。一些常用的,例如SendChatMessage, UseAction, CastSpellByName(““)之类的,如果能背下来将大大提高写宏效率。
3/ 长度优化:虽然有SuperMacro(强烈推荐)可以大大加大宏的长度,但是大道理不说,写那么长的宏不累么?
这是一个我很久以前写的1键换装宏,那个时候什么都不懂。
/script UseContainerItem(4,1); UseContainerItem(4,2); UseContainerItem(4,3); UseContainerItem(4,4); UseContainerItem(4,5); UseContainerItem(4,6); UseContainerItem(4,7); UseContainerItem(4,8); UseContainerItem(4,9); UseContainerItem(4,10)
很累不是么?如果现在写,我会写成
/script for i=1,10,1 do UseContainerItem(4,i) end
长度优化的方法有哪些:
i) 循环语句。For k=a,b,c do … end
以k=a为起始,k=b结束,每一步的间隔为c每次执行do后面的命令。K为任意变量
举例来说,下马宏
/script for k=1,16,1 do if string.find(UnitBuff(“player”,k),”mount”) then CancelBuff(k); break; end; end
注意一个是b-a要整除c,一个是do里面尽量不要干涉变量k(或你选择的随便什么东西),否则容易造成死循环。例如
/script for i=1,3,1 do i=1; SendChatMessage(“1”); end
每次do都会重置i到1,那么i永远到不了3,就会形成一个无限循环。你的WOW会马上失去响应……
另外,虽然一般见到的do里面都回含有k这个变量,例如我的例子里面就用了UnitBuff(“player”,k),但是这不是必须的。例如以下例子就不含有k
/script for k=1,100,1 do SendChatMessage(“大家一起鄙视我吧”) end
ii) 对某个需要经常出现的命令赋值:例如还是我之前那个换装宏,如果我不用for do end,那么我可以通过以下方法实现:
/script UCI=UseContainerItem; UCI(4,1); UCI(4,2) ……
iii) 集合:有时候需要比较多个量,那么通过集合+循环可以减少长度,例如
/script local n,s,k,j,d,f={"Abomi","Sarge","Immol"},{"腐蚀术","痛苦诅咒","献祭"};for k=1,3 do f=nil;for j=1,16 do d=UnitDebuff("target",j);if d and strfind(d,n[k]) then f=1;break;end;end;if not f then CastSpellByName(s[k]);break;end;end;
By Oblind
有兴趣的可以试一下一个一个写会有多长……
iv) 插件:有些插件可以把一些很麻烦的命令简化,例如isBuffActive之类的。一般判断buff需要的是
/script for i=1,16,1 do b=UnitBuff(“target”,i); if b and string.find(b,”xx”) then yy; break; end; end
但是通过这个插件之需要
/script if isBuffActive(xxxx) then yyyy end
v) fuction命令简化:通过function命令可以达到类似于上面的效果,不过每次要载入比较麻烦。可以写到任意插件的LUA文件里面简化。
vi) 有时候很长的一个命令可以通过其他一个命令实现。例如我上次见到有人施放技能用
/script ActionButtonDown(x); ActionButtonUp(x)
汗……一个UscAction就好了嘛……
4/ 可读性优化。这就是个人习惯问题了。例如本人缩写一般
UCI=UseContainerItem; CSB=CastSpellByName; SSC=SpellStopCasting()
这样写的好处就是就算加入了大量的缩写,我仍然能够看懂我写了什么东西。一旦有什么变化也方便修改。
5/ 适用性。使得这个宏用起来更加舒服也是非常重要的。举例来说,我的牧师当初有个宏提醒别人我在复活谁
/s 我正在复活%t
/script CastSpellByName(“复活术”)
但是有个问题,有时候我因为在战斗中点到制造噪音,怎么办呢?我就改为了
/script if (not UnitAffectingCombat(“player”)) then CastSpellByName(“复活术”); SendChatMessage(“我正在复活”..UnitName(“target”)) end
但是有时候仍然会制造噪音,只要我的目标不是我复活的人那么就会乱说话,那么我要当前目标是死人
/script if (not UnitAffectingCombat(“player”)) then if (UnitName(“target”)~=nil) and (UnitHealth(“target”)==0)) then CastSpellByName(“复活术”); SendChatMessage(“我正在复活”..UnitName(“target”) end; end
好吧,又有问题就是,如果我不选目标那么我不能放复活术了。继续
/script if (not UnitAffectingCombat(“player”)) then CastSpellByName(“复活术”); if ((UnitName(“target”)~=nil) and (UnitHealth(“target”))) then SendChatMessage(“我正在复活”..UnitName(“target”) end; end
至此这个宏才算写完。
先写这么多了,吃饭去也~
如果有错误或者补充,欢迎跟贴。另外加上WoWwiki的宏命令翻译,先翻译一部分,有时间再翻译剩下的。另外我的表达不太好,谁有兴趣吧我说的翻译成人话很欢迎 >_<
我要举报
大家都在看
推荐资讯