看群里讨论识别游戏背包里面的物品,由于物品图片带有闪光,脚本的找图命令找不到。
这个问题在游戏脚本中经常遇到,平时我在给群友解答时,经常会说不要以“动图”作为找图的标识。
但是如果非要找“动图”,该怎么办呢?
解答这个问题,就要说到动图的本质了,动图其实是多张图片循环切换的结果,其实视频也是一样的,我们经常听到多少多少帧,这里说的帧就是就是一个画面。
我们来分析一个动图,举个例子我们的聊天软件中经常有各种表情包,通常都是会动的,如下图:
用图片软件把它打开,看到这个表情是由两个帧组成。
当然这个动图比较简单,只是扇子的左右摆动,其他画面部分是不动的,所以帧画面只有两个。
假设我们要以这个表情为找图的标识,就可以找2张图,这两张图就是表情的两帧动画。
Dim intx,inty
FindPic 0, 0, 0, 0, "Attachment:1.png|Attachment:2.png","000000", 0, 0.9, intX, intY
If intX > -1 And intY > -1 Then
TracePrint intx,inty
End If
脚本通过找多图的方式就可以找到这个表情的位置坐标了。
把上面的方法应用到实际的例子中:
这里有个提示是不断闪烁的文字提示框。
我们要找个警示符号,按照上面的思路,第一步先把它分成多张图片,第二步用找图命令找多图。
确定好思路以后就可以着手去做的,这个“动图”并不是一个gif的图片,所以没有“帧”,那我就截图的方式连续的去截图。
For i = 0 To 100
SnapShot("/sdcard/pictures/a/"&i&".png",51,456,84,489)
Next
通过连续的截取101张图片,发现大概有3个循环,也就是动图大概是由三十多张图片组成,为啥这么多,应为有大量的过渡图片。
那么我们以0-34图为例去找图,先把35张图片放入到脚本附件中,然后运行下面的代码:
Dim intx,inty
KeepCapture
For i = 0 To 34
FindPic 0, 0, 0, 0, "Attachment:"&i&".png","000000", 0, 0.9, intX, intY
If intX > -1 And intY > -1 Then
TracePrint intx,inty
Exit For
End If
Next
ReleaseCapture
识别结果:
当前脚本第6行:51 456
通过抓抓工具确认了一下这个获取到的坐标是正确的。
在代码中,使用了截图到内存命令,这个命令很关键能够提高找图的速度。
经过测试使用截图到内存命令,运行时间是100毫秒以内,不是用截图到内存命令,运行时间是100-500毫秒。
测试结果中两种情况都是可以获取找到图。
另外找多图的命令也没有使用,而是用的循环找图,以及找到图的跳出循环,使用这种方式的原因是,当图片太多时,图片名称一个个写入到找图命令中,代码会非常的长容易写错,使用循环代替就方便很多。
本期内容就这些,最好我还是那句话尽量不要以“动图”作为找图的标识。
还没有评论,来说两句吧...