找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 113688|回复: 40

[教程源码] 【紫猫学院】最好用的超级找图命令——紫猫插件教程

  [复制链接]
  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
发表于 2018-1-12 21:56:44 | 显示全部楼层 |阅读模式

评分

参与人数 1猫粮 +1 收起 理由
qq871117148 + 1 赞一个!

查看全部评分

楼主热帖
  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
 楼主| 发表于 2018-1-12 23:20:28 | 显示全部楼层

最简洁的参数与灵活的返回值

可能新手刚看到超级图色命令的时候,会觉得好多的参数,好复杂的样子。

其实非常非常简单,因为它所有参数都是可选,并且绝大多数可以打乱顺序随意填写的,下面举几个简单常用的例子。


[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次

//================例子1================//
'查找两张图片, 分别是图片1.png和图片2.png
'查找范围默认全屏
'相似度默认0.8
'方向默认从左到右,从上到下
'图片所在路径默认为附件
Dim ret '定义找图返回值
ret = zm.FindPic("图片1.png|图片2.png")
'找到图片返回table, 没有找到返回null, 所以直接判断变量名
If ret Then 
        TracePrint "找到图片了, 返回值有以下3种使用方法, 任选一种使用"
        TracePrint "数组方式: 序号=" & ret(0), ", 坐标x=" & ret(1), ", 坐标y=" & ret(2), ", 图片名=" & ret(3)
        TracePrint "表下标方式: 序号=" & ret[1], ", 坐标x=" & ret[2], ", 坐标y=" & ret[3], ", 图片名=" & ret[4]
        TracePrint "表键名方式: 序号=" & ret["id"], ", 坐标x=" & ret["x"], ", 坐标y=" & ret["y"], ", 图片名=" & ret["name"]
Else 
        TracePrint "没有找到图片"
End If

//================例子2================//
'把返回值保存在数组参数中, 称为返回参数
'这种写法可以少写一行赋值代码, 美化脚本结构
'与例子1相似, 区别在于返回结果保存在了数组t中
'可以直接判断命令返回值, 也可以单独调用后判断返回数组t
Dim t() '定义返回参数数组, 必须是数组
If zm.FindPic("图片1.png|图片2.png", t) Then 
        TracePrint "找到图片了, 同样有以下3种使用方法, 任选一种使用"
        TracePrint "数组方式: 序号=" & t(0), ", 坐标x=" & t(1), ", 坐标y=" & t(2), ", 图片名=" & t(3)
        TracePrint "表下标方式: 序号=" & t[1], ", 坐标x=" & t[2], ", 坐标y=" & t[3], ", 图片名=" & t[4]
        TracePrint "表键名方式: 序号=" & t["id"], ", 坐标x=" & t["x"], ", 坐标y=" & t["y"], ", 图片名=" & t["name"]
Else 
        TracePrint "没有找到图片"
End If

//================例子3================//
'由于大部分找图返回结果只使用一次后, 就不会再使用了
'所以我们可以设置统一默认返回值, 让它保存最近一次找图结果
'通过使用zm.SetFindPic()设置默认返回参数数组tPic
'如果zm.FindPic()命令没有指定返回参数数组, 则默认保存在tPic中
'与例子2相似, 由于没有指定返回参数数组, 所以默认保存在tPic中
Dim tPic() '定义默认返回数组
zm.SetFindPic {"ret":tPic}
If zm.FindPic("图片1.png|图片2.png") Then 
        TracePrint "找到图片了, 同样有以下3种使用方法, 任选一种使用"
        TracePrint "数组方式: 序号=" & tPic(0), ", 坐标x=" & tPic(1), ", 坐标y=" & tPic(2), ", 图片名=" & tPic(3)
        TracePrint "表下标方式: 序号=" & tPic[1], ", 坐标x=" & tPic[2], ", 坐标y=" & tPic[3], ", 图片名=" & tPic[4]
        TracePrint "表键名方式: 序号=" & tPic["id"], ", 坐标x=" & tPic["x"], ", 坐标y=" & tPic["y"], ", 图片名=" & tPic["name"]
Else 
        TracePrint "没有找到图片"
End If
'由于前面设置过默认返回值, 所以后面所有zm.FindPic()命令在不写返回参数数组的情况下, 都会保存结果到tPic数组中
If zm.FindPic("图片3.png") Then 
        TracePrint "图片结果保存在tPic中", tPic(0), tPic(1), tPic(2), tPic(3)
End If

'指定返回参数数组tt后, 本次查找结果保存在数组tt中, 对默认返回数组tPic没有影响
Dim tt()
If zm.FindPic("图片4.png", tt) Then 
        TracePrint "本次结果tt:", tt[1], tt[2], tt[3], tt[4]
        TracePrint "默认数组tPic:", tPic[1], tPic[2], tPic[3], tPic[4]
End If

  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
 楼主| 发表于 2018-1-13 16:14:53 | 显示全部楼层

限时循环找图

脚本中找图的时机很重要,有时候屏幕上还没出现这图,你就开始找图的话,肯定找不到。

但是如果加延时后再找图的话,效率就太慢了。

这时候就需要限时循环找图登场了,他可以在指定时间内不断的查找图片,如果找到就立即停止找图,否则等超时后自动停止并返回没有找到

另外,当你想找一些动态变化的图片时,也可以使用本功能,截图多张不同样子的图片,再限时循环找图,找到任何一张都表示找到动态图了。

[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次

Dim tPic() '定义默认返回数组
zm.SetFindPic {"ret":tPic, "showlog":"显示"} '设置默认返回值与显示日志
//================例子4================//
'在5000毫秒内不断查找图片1.png和图片2.png
'找到任何一张都立即停止查找并保存结果
If zm.FindPic("图片1.png|图片2.png", 5000) Then 
        TracePrint "找到图片了, 序号=" & tPic(0), "x=" & tPic(1), "y=" & tPic(2), "图片名=" & tPic(3)
Else 
        TracePrint "没有找到图片"
End If
  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
 楼主| 发表于 2018-1-13 18:28:04 | 显示全部楼层

找到图后自动点击与延时

一般我们找到图片后常见的操作都是点击,所以本插件集成了自动点击功能。

更加强大的地方是,除了可以点击找到的坐标外,还可以点击偏移坐标、固定坐标、混合坐标、防检测随机坐标。

[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次

Dim tPic() '定义默认返回数组
zm.SetFindPic {"ret":tPic, "showlog":"显示"} '设置默认返回值与显示日志

//================例子5================//
'参数True表示开启点击找到坐标的功能, 默认为直接点击找到的坐标
If zm.FindPic("图片1.png|图片2.png", True) Then 
        TracePrint "找到图片并自动点击"
Else 
        TracePrint "没有找到图片, 不执行点击"
End If

//================例子6================//
'参数"+10,-20"表示找到图后, 点击找到坐标x+10,找到坐标y-20的位置, 也就是偏移点击
If zm.FindPic("图片1.png|图片2.png", True, "+10,-20") Then 
        TracePrint "找到图片并自动点击"
Else 
        TracePrint "没有找到图片, 不执行点击"
End If

//================例子7================//
'参数"100,200"表示找到图后, 点击固定坐标100,200的位置
If zm.FindPic("图片1.png|图片2.png", True, "100,200") Then 
        TracePrint "找到图片并自动点击"
Else 
        TracePrint "没有找到图片, 不执行点击"
End If

//================例子8================//
'参数"+0,-20,3000"表示找到图后, 点击找到坐标x+0,找到坐标y-20的位置(也就是x不变, y移动-20)
'点击后再延时3000毫秒
If zm.FindPic("图片1.png|图片2.png", True, "+0,-20,3000") Then 
        TracePrint "找到图片并自动点击"
Else 
        TracePrint "没有找到图片, 不执行点击"
End If

//================例子9================//
'参数"100,+200,1500"表示找到图后, 点击100,找到坐标y+200的位置(也就是x固定100,y移动200)
'点击后再延时1500毫秒
If zm.FindPic("图片1.png|图片2.png", True, "100,+200,1500") Then 
        TracePrint "找到图片并自动点击"
Else 
        TracePrint "没有找到图片, 不执行点击"
End If

//================例子10================//
'设置点击坐标的随机浮动值, x浮动在[-10,15], y浮动在[5,20]
'举个例子, 点击坐标100,200时, x随机范围是[100-10, 100+15], y随机范围是[200+5, 200+20]
'该浮动设置对所有超级图色命令有效, 对点击参数True和点击坐标参数也都有效
zm.SetTap {"minx":-10, "maxx":15, "miny":5, "maxy":20}
If zm.FindPic("图片1.png|图片2.png", True) Then 
        TracePrint "找到图片并随机点击[x-10,x+15],[y+5,y+20]"
Else 
        TracePrint "没有找到图片, 不执行点击"
End If
  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
 楼主| 发表于 2018-1-13 20:46:51 | 显示全部楼层

智能相似度

超级找图的相似度默认值是0.8,可以兼容绝大多数的找图需求。

但是一些特殊情况下,我们需要修改相似度,那么我们只需要在代码里加入相似度参数即可。

另外,当我们对相似度要求非常高,但是又不确定设置多少相似度合适时,可以使用智能相似度参数。

[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次

Dim tPic() '定义默认返回数组
zm.SetFindPic {"ret":tPic, "showlog":"显示"} '设置默认返回值与显示日志

//================例子11================//
'默认相似度为0.8, 参数取值范围[0, 1]
'下面是以0.9的相似度进行查找图片
If zm.FindPic("图片1.png", 0.9) Then 
        TracePrint "找到图片了, 序号=" & tPic(0), "x=" & tPic(1), "y=" & tPic(2), "图片名=" & tPic(3)
Else 
        TracePrint "没有找到图片"
End If

//================例子12================//
'当我们对相似度要求很高, 但是又不知道最佳相似度时, 可以使用智能相似度
'参数格式要求是"最小相似度-最大相似度-步长", 步长是可选的, 默认每次降低0.05
'一般智能相似度与限时循环参数搭配使用, 当然也可以独立使用
'启用智能相似度后, 固定相似度参数失效
'下面是以最低相似度0.8, 最高相似度0.9, 默认步长0.05的智能相似度方式找图
If zm.FindPic("图片1.png", "0.8-0.9") Then 
        TracePrint "找到图片了, 序号=" & tPic(0), "x=" & tPic(1), "y=" & tPic(2), "图片名=" & tPic(3)
Else 
        TracePrint "没有找到图片"
End If

'下面是以最低相似度0.9, 最高相似度1.0, 步长0.01, 限时查找5000毫秒的方式找图
If zm.FindPic("图片1.png", "0.9-1.0-0.01", 5000) Then 
        TracePrint "找到图片了, 序号=" & tPic(0), "x=" & tPic(1), "y=" & tPic(2), "图片名=" & tPic(3)
Else 
        TracePrint "没有找到图片"
End If
  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
 楼主| 发表于 2018-1-13 20:56:57 | 显示全部楼层

轻松实现缩放找图功能

按键精灵的缩放命令SetScreenScale()对FindPic无效,所以需要截取图片按照指定格式文件名保存,比如“横向分辨率x纵向分辨率xDPI-图片名.png”这种类型,然后每次找图代码都要处理图片名,非常麻烦。

这里我们可以通过设置图片默认前缀来实现自动使用对应分辨率图片功能。

当然,你需要提前把各个分辨率的图片截取保存下来,按照上面说的文件名格式放入附件中。

[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次

Dim tPic() '定义默认返回数组
zm.SetFindPic {"ret":tPic, "showlog":"显示"} '设置默认返回值与显示日志


//================例子13================//
zm.SetScreenScale 720, 1280        '设置屏幕缩放
'附件中存放各个分辨率的图片, 图片文件名格式为: 横向分辨率x纵向分辨率xDPI数值-图片名.png
Dim 图片前缀 = "Attachment:" & GetScreenX() & "x" & GetScreenY() & "x" & Device.GetDPI() & "-"
TracePrint "本设备的图片默认前缀为:", 图片前缀
zm.SetFindPic {"pic":图片前缀} '设置找图的图片前缀
If zm.FindPic("图片1.png|图片2.png") Then 
        '如果只写图片名的话, 插件就会自动帮你把图片前缀加上去
        TracePrint "找到图片了, 序号=" & tPic(0), ", x=" & tPic(1), ", y=" & tPic(2), ", 图片名=" & tPic(3)
Else 
        TracePrint "没找到图片"
End If

//================例子14================//
'如果写了完整图片路径参数的话, 插件不会加入前缀
If zm.FindPic("Attachment:图片1.png|/sdcard/图片2.png|图片3.png") Then 
        '可以通过内置日志输出功能看到, 图片1和图片2是原来的路径, 图片3加入了前缀路径
        TracePrint "找到图片了, 序号=" & tPic(0), ", x=" & tPic(1), ", y=" & tPic(2), ", 图片名=" & tPic(3)
Else 
        TracePrint "没找到图片"
End If
  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
 楼主| 发表于 2018-1-13 21:48:26 | 显示全部楼层

调试分析利器

开发脚本过程中,TracePrint的调试输出必不可少,但是每次找图命令后面都加一个输出就太麻烦了,不加又不好分析代码。

超级找图提供内置日志输出显示功能,可以让我们很直观的看到脚本每次找图的结果,方便查找出错的原因。

[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次

//================例子15================//
'参数"显示"表示开启内置日志输出, 也可以使用"show"来代替
'可以通过输出内容查看详细参数数据
zm.FindPic "图片1.png|图片2.png", "显示"

//================例子16================//
'每次都填写"显示"会很麻烦, 可以通过zm.SetFindPic()设置为默认显示日志
'也可以使用zm.SetShowLog()开启所有超级图色的日志显示
zm.SetFindPic {"showlog":"显示"}
zm.FindPic "图片1.png|图片2.png"
'如果开启后, 某些找图不想显示输出, 那就选择"隐藏", 也可以填写"hide"
zm.FindPic "图片1.png|图片2.png", "隐藏"

//================例子17================//
'默认输出格式会比较混乱, 不方便识别对应代码, 所以我们可以加入备注参数
'备注参数格式为@开头的字符串, 如果填写@@的话, 还会浮窗显示日志
'注意, 只有开启日志输出显示后, 备注才有效
zm.FindPic "图片1.png|图片2.png", "@寻找史莱姆"
zm.FindPic "图片1.png|图片2.png", "@@在浮窗显示"

//================例子18================//
'除了备注可以美化输出外, 也可以指定输出行号来对应代码
'行号参数格式以_开头, 后面跟数字行号
'该参数使用局限性较大, 因为如果前面代码变动导致行号变化, 那么就要手动修改行号参数
zm.FindPic "图片1.png|图片2.png", "_28"
  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
 楼主| 发表于 2018-1-13 22:08:37 | 显示全部楼层

自定义查找范围与方向

有时候屏幕上有多张相同图片,我们需要指定范围查找,或者修改查找方向获取不同结果。

这时候就需要范围参数与方向了。

[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次

Dim tPic() '定义默认返回数组
zm.SetFindPic {"ret":tPic, "showlog":"显示"} '设置默认返回值与显示日志

//================例子19================//
'默认是全屏查找图片, 但有时候需要指定范围查找, 可以通过范围参数实现
'也可以用zm.SetFindPic()修改默认范围
'注意, 范围顺序是左上角xy坐标和右下角xy坐标, 必须写完整, 不可打乱顺序
If zm.FindPic(100, 200, 500, 600, "图片1.png|图片2.png") Then 
        TracePrint "找到图片了, 序号=" & tPic(0), ", x=" & tPic(1), ", y=" & tPic(2), ", 图片名=" & tPic(3)
Else 
        TracePrint "没找到图片"
End If

'如果你还要加入相似度与超时时间的话, 请把范围参数放在最前面, 以免识别参数出错
'下面代码中, 相似度0.9和超时5000可以自由更换位置, 但是必须位于范围参数后面
zm.FindPic "图片.png", 10, 20, 50, 60, 0.9, 5000

//================例子20================//
'查找方向参数是字符串, 分别是["左上","中心","右上","左下","右下","上左","上右","下左","下右"]这几个值
'中文与数字比较起来, 中文更加便于理解, 比如左上就是从左到右从上到下的顺序
zm.FindPic "图片.png", "中心"
  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
 楼主| 发表于 2018-1-13 22:30:32 | 显示全部楼层

强大的对象参数使用

在小脚本开发过程中,命令都是信手拈来,参数也是随手填写的。

但是开发大型脚本的时候,必须要管理好每一个变量数据,如果所有代码都分散在各行中,想要查找并修改某一处代码,是很困难的。

这里我们可以使用对象参数,把每一条的图色数据都收集起来,定义在table数组中,然后命令直接使用这个table数组作为参数使用,我们称之为对象参数。

[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次

Dim tPic() '定义默认返回数组
zm.SetFindPic {"ret":tPic, "showlog":"显示"} '设置默认返回值与显示日志

//================例子21================//
'定义史莱姆对象数组, 将超级找图要用到的所有参数都丢进来
'注意范围参数要在超时参数和相似度参数前面, 其他参数全部都可以打乱顺序
Dim 史莱姆 = {"@找史莱姆","史莱姆图.png", 100,200,500,600,true,"0.9-1.0",5000}
If zm.FindPic(史莱姆) Then 
	TracePrint "找到图片了, 序号=" & tPic(0), ", x=" & tPic(1), ", y=" & tPic(2), ", 图片名=" & tPic(3)
Else 
	TracePrint "没找到图片"
End If

//================例子22================//
'定义对象使用后, 如果个别代码需要改动部分参数, 可以直接在命令中加入对应参数
'下面就实现了关闭点击, 修改查找范围的功能
Dim 黑龙 = {"@找黑龙", "黑龙.png", true, "0.9-1.0", 5000}
If zm.FindPic(黑龙, 100, 300, 500, 700, false) Then 
	TracePrint "找到图片了, 序号=" & tPic(0), ", x=" & tPic(1), ", y=" & tPic(2), ", 图片名=" & tPic(3)
Else 
	TracePrint "没找到图片"
End If
  • 打卡等级:行侠仗义

1080

主题

2101

回帖

4281

积分

院长

鲜花
6
猫粮
7395
QQ
 楼主| 发表于 2018-1-13 22:32:18 | 显示全部楼层

定制属于自己的默认值

超级找图命令的参数默认值可以通过zm.SetFindPic()命令自由调整。

比如本次脚本图片比较模糊,需要降低相似度,那么就修改默认相似度的值。

所有找图都想输出显示日志,那么就修改日志显示默认值。

[按键精灵] 纯文本查看 复制代码
Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次

//================例子23================//
Dim tPic() '定义默认返回数组
'设置所有超级找图的默认返回参数tPic, 默认显示日志, 相似度默认0.7, 超时时间5000毫秒
zm.SetFindPic {"ret":tPic, "showlog":"显示", "sim":0.7, "timeout":5000}

zm.FindPic "看输出.png"
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|紫猫编程学园

GMT+8, 2024-3-29 20:49

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表