• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[紫猫] [按键手机插件开发]10. 支持可选参数的多点找色插件开发 [复制链接]

1#
本系列教程目的是让大家掌握Lua基本语法与按键精灵手机版的插件开发制作,丰富按键精灵生态环境,让按键精灵变得更加强大!
本教程中部分知识点参考《Lua程序设计》书籍,有兴趣可以自行购买→传送门
按键精灵手机版插件的开发标准草案请阅读帖子:http://bbs.anjian.com/showtopic-697779-1.aspx
紫猫学院也有提供Lua插件开发的VIP教学服务,有兴趣请咨询紫猫老师QQ345911220或微信zimaoxy

大家应该用过紫猫插件中的超级图色系列命令,大量的可选参数使用起来非常灵活,这是因为插件内部对参数做了大量判断处理。我们开发插件的主要目的就是为了让将来的代码工作变得更加轻松,这节课就让我们来学习下如何去优化多点找色命令,实现可选参数的功能,毕竟按键自带的多点找色参数真的太多了。

这里我们先学习一个可选参数默认值的知识点,大家都知道lua函数的参数在不写的情况下,值为 nil ,所以我们可以通过简单的 if 判断代码,通过判断参数是否为 nil 来实现默认值赋值,如下代码所示,这是一个标准的默认参数写法。

  1. -- 如果不传入参数x, 那么参数x的值就是1
  2. function foo(x)
  3. if x == nil then
  4. x = 1
  5. end
  6. print(x)
  7. end
复制代码


但是上述代码量有点多,需要3行代码才能写好一个默认参数,我们可以利用 or 运算符来简化代码,但是注意,or 运算符的简化不适用与布尔型的参数数据!它的原理是利用了Lua的 or 运算符在遇到左边为真时,返回左边值,所以如果x是真,那么就直接返回x,除非x是 nil 或者 false ,才返回右边1,正因为布尔型参数存在 false 的情况,所以本方法不适用布尔型参数!

  1. -- 如果不传入参数x, 那么参数x的值就是1
  2. function foo(x)
  3. x = x or 1
  4. print(x)
  5. end
复制代码


掌握可选参数默认值写法后,我们来优化下多点找色FindMultiColor命令,我们将参数顺序做一次调整,其中多点找色肯定要有颜色参数,所以我们将颜色参数放到最前面,其次是返回表参数,接下来是相似度,范围,方向。其中颜色参数是必填的,其他参数都是可选的。经过这思路整理,我们的插件代码如下

  1. -- 重新优化过参数顺序的多点找色, 支持可选参数.
  2. -- 参数: 第一点颜色, 偏移颜色组, 返回表, 相似度, 左上角x, 左上角y, 右下角x, 右下角y, 方向
  3. -- 除了前两个颜色参数必填, 其他参数都是可选, 相似度默认0.9, 范围默认全屏, 方向默认为0
  4. -- 命令返回值在找不到时为null, 找到为表{x, y, x=x, y=y}; 参数返回表在找不到时返回{-1,-1,x=-1,y=-1}
  5. function zimao.FindMultiColor(color1, color2, ret, sim, x1, y1, x2, y2,dir)
  6. return try {
  7. function ()
  8. ret = ret or {}
  9. sim = sim or 0.9
  10. x1 = x1 or 0
  11. y1 = y1 or 0
  12. x2 = x2 or 0
  13. y2 = y2 or 0
  14. dir = dir or 0
  15. ret.x, ret.y = LuaAuxLib.FindMultiColor(x1,y1,x2,y2,color1,color2,dir,sim)
  16. ret[1], ret[2] = ret.x, ret.y
  17. if ret.x>-1 then
  18. return ret
  19. end
  20. end,
  21. catch {
  22. function (errors)
  23. traceprint("发生运行时错误!错误代码:FindPic(),错误信息:", errors)
  24. end
  25. }
  26. }
  27. end
复制代码


这个函数虽然不支持乱序参数,但是已经非常强大了,大家来看下在按键精灵中调用的代码例子

  1. Import "zimaoxy.lua"

  2. //返回值调用方式
  3. Dim 坐标 = zimaoxy.FindMultiColor("AAAAAA","-55|103|56310F,45|19|341904,14|33|3F3FD0,-128|32|D6C550")
  4. If 坐标 Then
  5. TracePrint "找到坐标", 坐标["x"], 坐标["y"]
  6. TracePrint "也可以用下标", 坐标[1], 坐标[2]
  7. Else
  8. TracePrint "没有找到"
  9. End If


  10. //返回参数调用方式
  11. Dim 返回表()
  12. If zimaoxy.FindMultiColor("AAAAAA", "-55|103|56310F,45|19|341904,14|33|3F3FD0,-128|32|D6C550", 返回表) Then
  13. TracePrint "找到坐标", 返回表["x"], 返回表["y"]
  14. TracePrint "也可以用下标", 返回表[1], 返回表[2]
  15. Else
  16. TracePrint "没找到"
  17. End If
复制代码


附:
完整插件代码
  1. local _zimao = {} --这是内部私有table函数
  2. local zimao = {} --这是对外公开table函数
  3. QMPlugin = zimao --通过这行代码, 实现将zimao表中所有函数对外公开

  4. _zimao.version = "20220310" --插件版本号, 方便自己记忆

  5. local function try(block) -- 保护执行函数
  6. local tablejoin = function (...)
  7. local result = {}
  8. for _, t in ipairs({...}) do
  9. if type(t) == "table" then
  10. for k, v in pairs(t) do
  11. if type(k) == "number" then table.insert(result, v)
  12. else result[k] = v end
  13. end
  14. else
  15. table.insert(result, t)
  16. end
  17. end
  18. return result
  19. end

  20. -- get the try function
  21. local try = block[1]
  22. assert(try)

  23. -- get catch and finally functions
  24. local funcs = tablejoin(block[2] or {}, block[3] or {})

  25. -- try to call it
  26. local result_error = {}
  27. local results = {pcall(try)}
  28. if not results[1] then
  29. -- run the catch function
  30. if funcs and funcs.catch then
  31. result_error = {funcs.catch(results[2])}
  32. end
  33. end

  34. -- run the finally function
  35. if funcs and funcs.finally then
  36. local result_fin = {funcs.finally(table.unpack(results))}
  37. if #result_fin > 0 then
  38. return table.unpack(result_fin)
  39. end
  40. end

  41. -- ok?
  42. if results[1] and #results > 1 then
  43. return table.unpack(results, 2, #results)
  44. else
  45. if #result_error > 0 then
  46. return table.unpack(result_error)
  47. else
  48. return nil
  49. end
  50. end
  51. end
  52. local function catch(block) --异常捕获函数
  53. return {catch = block[1]}
  54. end
  55. local function finally(block) --最终必定执行函数
  56. return {finally = block[1]}
  57. end

  58. -- 常用的内部函数, 不加入私有table中, 直接定义使用
  59. local function traceprint(...) --调用按键精灵的调试输出命令
  60. if QMPlugin then -- 在Lua调试环境下, QMPlugin变量的值是我们插件公开table函数值, 而在按键精灵调试运行环境下, 该变量值被替换为nil
  61. print(...)
  62. else
  63. -- 获取可变长参数的第一个参数值
  64. local line = select(1, ...)
  65. -- 如果第一个参数是字符串, 并且符合格式 _数字 , 则判定为行号意思
  66. if type(line) == "string" and line:match("^%_%d+[ DISCUZ_CODE_4 ]quot;) then
  67. -- 第一个参数按照格式 _数字: 传入TracePrint中可实现打印行号功能
  68. LuaAuxLib.TracePrint(line .. ":", table.concat({...}, " ", 2, select("#", ...)))
  69. elseif line == ":" and #{...} > 1 then
  70. -- 第一个参数是冒号 : 时, 表示直接打印输出数据
  71. LuaAuxLib.TracePrint(":", table.concat({...}, " ", 2, select("#", ...)))
  72. else
  73. -- 其他的情况下则加上前缀后, 进行正常输出
  74. LuaAuxLib.TracePrint(":","紫猫学院测试插件:", ...)
  75. end
  76. end
  77. end

  78. -- 实现获取变量信息的插件函数, 需对外公开, 所以使用zimao前缀
  79. function zimao.VarInfo(...)
  80. -- 防止无法获取nil参数
  81. local paramCount = select("#", ...)
  82. local varType, printStr, t = "", "", {}
  83. for i = 1, paramCount do
  84. local v = select(i, ...)
  85. try {
  86. function()
  87. varType = type(v)
  88. if varType == "table" then
  89. printStr = "【" .. varType .." " .. tostring(#v) .. "】" .. LuaAuxLib.Encode_GetJsonLib():encode(v)
  90. elseif varType == "number" or varType == "string" then
  91. printStr = "【" .. varType .." " .. tostring(#tostring(v)) .. "】" .. tostring(v)
  92. elseif varType == "boolean" or varType == "null" then
  93. printStr = "【" .. varType .."】" .. tostring(v)
  94. else
  95. printStr = "【" .. varType .."】 未知数据,无法查看!"
  96. end
  97. table.insert( t, #t + 1, printStr )
  98. end,
  99. catch {
  100. function (errors)
  101. -- 下面这个traceprint是我们上面定义过的内部输出命令,注意大小写
  102. traceprint("发生运行时错误!错误代码:VarInfo(),错误信息:", errors)
  103. end
  104. }
  105. }
  106. end
  107. printStr = table.concat( t, ", " )
  108. return printStr
  109. end

  110. -- 实现打印输出变量详细信息数据, 需对外公开
  111. function zimao.TracePrint(...)
  112. -- 通过VarInfo函数获取参数的详细数据信息
  113. local info = zimao.VarInfo(...)
  114. try {
  115. function()
  116. -- 在保护模式下打印输出这个数据内容
  117. traceprint(info)
  118. end,
  119. catch {
  120. function (errors)
  121. traceprint("发生运行时错误!错误代码:TracePrint(),错误信息:", errors)
  122. end
  123. }
  124. }
  125. end

  126. -- 遍历按键精灵的LuaAuxLib库下所有函数命令
  127. function zimao.ScanLuaAuxLib()
  128. -- 以保护模式运行, 避免插件错误造成脚本终止
  129. try {
  130. function()
  131. -- 遍历LuaAuxLib内的内容
  132. for k, v in pairs(LuaAuxLib) do
  133. -- 使用自定义函数traceprint在按键精灵中打印函数名
  134. traceprint("名称: " .. k, "类型: " .. type(v))
  135. end
  136. end,
  137. catch {
  138. function (errors)
  139. traceprint("发生运行时错误!错误代码:ScanLuaAuxLib(),错误信息:", errors)
  140. end
  141. }
  142. }
  143. end

  144. -- 数组排序, false为升序, true为降序, 省略默认为false
  145. function zimao.Sort(list, comp)
  146. return try {
  147. function ()
  148. -- 定义排序规则函数
  149. local f = function(a, b)
  150. if comp then
  151. return a > b
  152. else
  153. return a < b
  154. end
  155. end
  156. -- 返回排序结果
  157. return table.sort(list, f)
  158. end,
  159. catch {
  160. function (errors)
  161. traceprint("发生运行时错误!错误代码:Sort(),错误信息:", errors)
  162. end
  163. }
  164. }
  165. end

  166. -- 随机数
  167. function zimao.RndNum(m, n)
  168. return try {
  169. function ()
  170. m = tonumber(m) or 0
  171. n = tonumber(n) or 0
  172. local max = ( m > n ) and m or n
  173. local min = ( m < n ) and m or n
  174. return math.random(min, max)
  175. end,
  176. catch {
  177. function (errors)
  178. traceprint("发生运行时错误!错误代码:RndNum(),错误信息:", errors)
  179. end
  180. }
  181. }
  182. end

  183. -- 重新优化过参数顺序的多点找色, 支持可选参数.
  184. -- 参数: 第一点颜色, 偏移颜色组, 返回表, 相似度, 左上角x, 左上角y, 右下角x, 右下角y, 方向
  185. -- 除了前两个颜色参数必填, 其他参数都是可选, 相似度默认0.9, 范围默认全屏, 方向默认为0
  186. -- 命令返回值在找不到时为null, 找到为表{x, y, x=x, y=y}; 参数返回表在找不到时返回{-1,-1,x=-1,y=-1}
  187. function zimao.FindMultiColor(color1, color2, ret, sim, x1, y1, x2, y2,dir)
  188. return try {
  189. function ()
  190. sim = sim or 0.9
  191. ret = ret or {}
  192. x1 = x1 or 0
  193. y1 = y1 or 0
  194. x2 = x2 or 0
  195. y2 = y2 or 0
  196. dir = dir or 0
  197. ret.x, ret.y = LuaAuxLib.FindMultiColor(x1,y1,x2,y2,color1,color2,dir,sim)
  198. ret[1], ret[2] = ret.x, ret.y
  199. if ret.x>-1 then
  200. return ret
  201. end
  202. end,
  203. catch {
  204. function (errors)
  205. traceprint("发生运行时错误!错误代码:FindPic(),错误信息:", errors)
  206. end
  207. }
  208. }
  209. end
复制代码


【紫猫编程学院】火热招生中

教学涉及按键精灵(电脑版与手机版)、网页、游戏、办公、插件等。

报名咨询QQ: 345911220 微信:zimaoxy

紫猫学院免费教程

加入交流QQ群: 7333555


2#

看看

3#

很高打车

4#


5#

学习下用法

6#

学习一下

7#

不太懂

8#

给士大夫

9#

学习学习

10#

1111111

11#

很厉害的样子啊

12#

真好

13#

xiexiefanxiang

14#

这么强大的吗,试试

发新话题 回复该主题