- 按键认证导师
- 513852
- 3624
- 47
- 4633 朵
- 28052 个
- 6157 个
- 190000
- 2010-10-09
|
1#
t
T
发表于 2022-03-20 17:29
|
|只看楼主
大家应该用过紫猫插件中的超级图色系列命令,大量的可选参数使用起来非常灵活,这是因为插件内部对参数做了大量判断处理。我们开发插件的主要目的就是为了让将来的代码工作变得更加轻松,这节课就让我们来学习下如何去优化多点找色命令,实现可选参数的功能,毕竟按键自带的多点找色参数真的太多了。
这里我们先学习一个可选参数默认值的知识点,大家都知道lua函数的参数在不写的情况下,值为 nil ,所以我们可以通过简单的 if 判断代码,通过判断参数是否为 nil 来实现默认值赋值,如下代码所示,这是一个标准的默认参数写法。
- -- 如果不传入参数x, 那么参数x的值就是1
- function foo(x)
- if x == nil then
- x = 1
- end
- print(x)
- end
复制代码
但是上述代码量有点多,需要3行代码才能写好一个默认参数,我们可以利用 or 运算符来简化代码,但是注意,or 运算符的简化不适用与布尔型的参数数据!它的原理是利用了Lua的 or 运算符在遇到左边为真时,返回左边值,所以如果x是真,那么就直接返回x,除非x是 nil 或者 false ,才返回右边1,正因为布尔型参数存在 false 的情况,所以本方法不适用布尔型参数!
- -- 如果不传入参数x, 那么参数x的值就是1
- function foo(x)
- x = x or 1
- print(x)
- end
复制代码
掌握可选参数默认值写法后,我们来优化下多点找色FindMultiColor命令,我们将参数顺序做一次调整,其中多点找色肯定要有颜色参数,所以我们将颜色参数放到最前面,其次是返回表参数,接下来是相似度,范围,方向。其中颜色参数是必填的,其他参数都是可选的。经过这思路整理,我们的插件代码如下
- -- 重新优化过参数顺序的多点找色, 支持可选参数.
- -- 参数: 第一点颜色, 偏移颜色组, 返回表, 相似度, 左上角x, 左上角y, 右下角x, 右下角y, 方向
- -- 除了前两个颜色参数必填, 其他参数都是可选, 相似度默认0.9, 范围默认全屏, 方向默认为0
- -- 命令返回值在找不到时为null, 找到为表{x, y, x=x, y=y}; 参数返回表在找不到时返回{-1,-1,x=-1,y=-1}
- function zimao.FindMultiColor(color1, color2, ret, sim, x1, y1, x2, y2,dir)
- return try {
- function ()
- ret = ret or {}
- sim = sim or 0.9
- x1 = x1 or 0
- y1 = y1 or 0
- x2 = x2 or 0
- y2 = y2 or 0
- dir = dir or 0
- ret.x, ret.y = LuaAuxLib.FindMultiColor(x1,y1,x2,y2,color1,color2,dir,sim)
- ret[1], ret[2] = ret.x, ret.y
- if ret.x>-1 then
- return ret
- end
- end,
- catch {
- function (errors)
- traceprint("发生运行时错误!错误代码:FindPic(),错误信息:", errors)
- end
- }
- }
- end
复制代码
这个函数虽然不支持乱序参数,但是已经非常强大了,大家来看下在按键精灵中调用的代码例子
- Import "zimaoxy.lua"
- //返回值调用方式
- Dim 坐标 = zimaoxy.FindMultiColor("AAAAAA","-55|103|56310F,45|19|341904,14|33|3F3FD0,-128|32|D6C550")
- If 坐标 Then
- TracePrint "找到坐标", 坐标["x"], 坐标["y"]
- TracePrint "也可以用下标", 坐标[1], 坐标[2]
- Else
- TracePrint "没有找到"
- End If
- //返回参数调用方式
- Dim 返回表()
- If zimaoxy.FindMultiColor("AAAAAA", "-55|103|56310F,45|19|341904,14|33|3F3FD0,-128|32|D6C550", 返回表) Then
- TracePrint "找到坐标", 返回表["x"], 返回表["y"]
- TracePrint "也可以用下标", 返回表[1], 返回表[2]
- Else
- TracePrint "没找到"
- End If
复制代码
附: 完整插件代码
- local _zimao = {} --这是内部私有table函数
- local zimao = {} --这是对外公开table函数
- QMPlugin = zimao --通过这行代码, 实现将zimao表中所有函数对外公开
- _zimao.version = "20220310" --插件版本号, 方便自己记忆
- local function try(block) -- 保护执行函数
- local tablejoin = function (...)
- local result = {}
- for _, t in ipairs({...}) do
- if type(t) == "table" then
- for k, v in pairs(t) do
- if type(k) == "number" then table.insert(result, v)
- else result[k] = v end
- end
- else
- table.insert(result, t)
- end
- end
- return result
- end
-
- -- get the try function
- local try = block[1]
- assert(try)
-
- -- get catch and finally functions
- local funcs = tablejoin(block[2] or {}, block[3] or {})
-
- -- try to call it
- local result_error = {}
- local results = {pcall(try)}
- if not results[1] then
- -- run the catch function
- if funcs and funcs.catch then
- result_error = {funcs.catch(results[2])}
- end
- end
-
- -- run the finally function
- if funcs and funcs.finally then
- local result_fin = {funcs.finally(table.unpack(results))}
- if #result_fin > 0 then
- return table.unpack(result_fin)
- end
- end
-
- -- ok?
- if results[1] and #results > 1 then
- return table.unpack(results, 2, #results)
- else
- if #result_error > 0 then
- return table.unpack(result_error)
- else
- return nil
- end
- end
- end
- local function catch(block) --异常捕获函数
- return {catch = block[1]}
- end
- local function finally(block) --最终必定执行函数
- return {finally = block[1]}
- end
- -- 常用的内部函数, 不加入私有table中, 直接定义使用
- local function traceprint(...) --调用按键精灵的调试输出命令
- if QMPlugin then -- 在Lua调试环境下, QMPlugin变量的值是我们插件公开table函数值, 而在按键精灵调试运行环境下, 该变量值被替换为nil
- print(...)
- else
- -- 获取可变长参数的第一个参数值
- local line = select(1, ...)
- -- 如果第一个参数是字符串, 并且符合格式 _数字 , 则判定为行号意思
- if type(line) == "string" and line:match("^%_%d+[ DISCUZ_CODE_4 ]quot;) then
- -- 第一个参数按照格式 _数字: 传入TracePrint中可实现打印行号功能
- LuaAuxLib.TracePrint(line .. ":", table.concat({...}, " ", 2, select("#", ...)))
- elseif line == ":" and #{...} > 1 then
- -- 第一个参数是冒号 : 时, 表示直接打印输出数据
- LuaAuxLib.TracePrint(":", table.concat({...}, " ", 2, select("#", ...)))
- else
- -- 其他的情况下则加上前缀后, 进行正常输出
- LuaAuxLib.TracePrint(":","紫猫学院测试插件:", ...)
- end
- end
- end
- -- 实现获取变量信息的插件函数, 需对外公开, 所以使用zimao前缀
- function zimao.VarInfo(...)
- -- 防止无法获取nil参数
- local paramCount = select("#", ...)
- local varType, printStr, t = "", "", {}
- for i = 1, paramCount do
- local v = select(i, ...)
- try {
- function()
- varType = type(v)
- if varType == "table" then
- printStr = "【" .. varType .." " .. tostring(#v) .. "】" .. LuaAuxLib.Encode_GetJsonLib():encode(v)
- elseif varType == "number" or varType == "string" then
- printStr = "【" .. varType .." " .. tostring(#tostring(v)) .. "】" .. tostring(v)
- elseif varType == "boolean" or varType == "null" then
- printStr = "【" .. varType .."】" .. tostring(v)
- else
- printStr = "【" .. varType .."】 未知数据,无法查看!"
- end
- table.insert( t, #t + 1, printStr )
- end,
- catch {
- function (errors)
- -- 下面这个traceprint是我们上面定义过的内部输出命令,注意大小写
- traceprint("发生运行时错误!错误代码:VarInfo(),错误信息:", errors)
- end
- }
- }
- end
- printStr = table.concat( t, ", " )
- return printStr
- end
- -- 实现打印输出变量详细信息数据, 需对外公开
- function zimao.TracePrint(...)
- -- 通过VarInfo函数获取参数的详细数据信息
- local info = zimao.VarInfo(...)
- try {
- function()
- -- 在保护模式下打印输出这个数据内容
- traceprint(info)
- end,
- catch {
- function (errors)
- traceprint("发生运行时错误!错误代码:TracePrint(),错误信息:", errors)
- end
- }
- }
- end
- -- 遍历按键精灵的LuaAuxLib库下所有函数命令
- function zimao.ScanLuaAuxLib()
- -- 以保护模式运行, 避免插件错误造成脚本终止
- try {
- function()
- -- 遍历LuaAuxLib内的内容
- for k, v in pairs(LuaAuxLib) do
- -- 使用自定义函数traceprint在按键精灵中打印函数名
- traceprint("名称: " .. k, "类型: " .. type(v))
- end
- end,
- catch {
- function (errors)
- traceprint("发生运行时错误!错误代码:ScanLuaAuxLib(),错误信息:", errors)
- end
- }
- }
- end
- -- 数组排序, false为升序, true为降序, 省略默认为false
- function zimao.Sort(list, comp)
- return try {
- function ()
- -- 定义排序规则函数
- local f = function(a, b)
- if comp then
- return a > b
- else
- return a < b
- end
- end
- -- 返回排序结果
- return table.sort(list, f)
- end,
- catch {
- function (errors)
- traceprint("发生运行时错误!错误代码:Sort(),错误信息:", errors)
- end
- }
- }
- end
- -- 随机数
- function zimao.RndNum(m, n)
- return try {
- function ()
- m = tonumber(m) or 0
- n = tonumber(n) or 0
- local max = ( m > n ) and m or n
- local min = ( m < n ) and m or n
- return math.random(min, max)
- end,
- catch {
- function (errors)
- traceprint("发生运行时错误!错误代码:RndNum(),错误信息:", errors)
- end
- }
- }
- end
- -- 重新优化过参数顺序的多点找色, 支持可选参数.
- -- 参数: 第一点颜色, 偏移颜色组, 返回表, 相似度, 左上角x, 左上角y, 右下角x, 右下角y, 方向
- -- 除了前两个颜色参数必填, 其他参数都是可选, 相似度默认0.9, 范围默认全屏, 方向默认为0
- -- 命令返回值在找不到时为null, 找到为表{x, y, x=x, y=y}; 参数返回表在找不到时返回{-1,-1,x=-1,y=-1}
- function zimao.FindMultiColor(color1, color2, ret, sim, x1, y1, x2, y2,dir)
- return try {
- function ()
- sim = sim or 0.9
- ret = ret or {}
- x1 = x1 or 0
- y1 = y1 or 0
- x2 = x2 or 0
- y2 = y2 or 0
- dir = dir or 0
- ret.x, ret.y = LuaAuxLib.FindMultiColor(x1,y1,x2,y2,color1,color2,dir,sim)
- ret[1], ret[2] = ret.x, ret.y
- if ret.x>-1 then
- return ret
- end
- end,
- catch {
- function (errors)
- traceprint("发生运行时错误!错误代码:FindPic(),错误信息:", errors)
- end
- }
- }
- end
复制代码
|