按键精灵抓图脚本 新手教程——按键精灵脚本来模拟合成灯笼
下图是某游戏的合成灯笼界面,通过拖拽把相同的灯笼合成更高一级的灯笼。我想用脚本来自动合成,完全自动化。
下图是实现后的效果:
通过脚本大大提高合成速度!
其实这里并不是用到反编译和逆向的知识,只是用了按键精灵写了模拟合成的脚本,本篇文章就先讲按键精灵的使用吧,反编译的其他知识后面我会逐一分享,因为这个按键精灵也是我这段时间折腾的一部分。
进入正题
折腾吧。
环境要求与即将使用的工具
环境版本
操作系统
本人的mac是双系统(MacOSX和Win7),按键精灵脚本需要在Windows开发
按键精灵手机助手 for Windows
3.5.2
按键精灵iOS版
1.5.2
手机系统
iPhone7 iOS11 需要越狱
思路
一开始我的做法:
怎么让脚本知道是两个相同的灯笼,然后又怎么模拟灯笼拖拽去合并?我想到了按键精灵,早起用过电脑版的用来辅助游戏,想不到现在有手机版的了!所以想看看怎么弄,我基本也是从零学起的。
了解按键精灵 iOS 版可以模拟我们人手的任何触摸指令,我就有信心做这个合成判断了,按键精灵的代码是MQ语言,有相关手册大家可以去看。
思路是把 12 个灯笼区域分割成 12 个区域,坐标存放在数组中,然后拿每一个灯笼来和第一个灯笼比较特征,特征相同就触发模拟拖拽合并。
另一种做法:用冒泡算法不判断色点,简单粗暴每个格子都移动合并,不管是不是相同灯笼,没想到效率更高!代码更简单效率更快!
实现代码
这里只列出核心代码,具体代码见:github
()
ShowMessage "启动脚本。。。。。"
// 横屏
//x
//|__ y
Dim offsetX = 260
Dim offsetY = 292
Dim CloseXPoint = array(988,2010)
// 3 个特征点 array(y, x)
Dim point1 = array(876, 760)
Dim point2 = array(833,777)
Dim point3 = array(894,757)
// 第一个灯笼的特征
Dim firstDengLong = array(array(point1(0), point1(1), GetPixelColor(point1(0), point1(1))), array(point2(0), point2(1), GetPixelColor(point2(0), point2(1))), array(point3(0), point3(1), GetPixelColor(point3(0), point3(1))) )
Dim dengLongArr = array()
Dim i=0,count=0
// 所有灯笼的比较坐标点,12个 [[[5,3],[3,1]] , [[5,3],[3,1]]]
// 12 次循环
For i = 0 To 2
dim j = 0
For j = 0 To 3
dengLongArr(count) = array()
// 类似 dengLongArr[count][0]
dengLongArr(count, 0) = Array(firstDengLong(0, 0) - i * offsetX, firstDengLong(0, 1) + j * offsetY)
dengLongArr(count, 1) = Array(firstDengLong(1, 0) - i * offsetX, firstDengLong(1, 1) + j * offsetY)
dengLongArr(count, 2) = Array(firstDengLong(2, 0) - i * offsetX, firstDengLong(2, 1) + j * offsetY)
count = count + 1
Next
Next
// 合并灯笼
Function heBingDengLong()
i = 0
j = 0
// 第一个灯笼的特征
Dim firstDengLong = array(array(point1(0), point1(1), GetPixelColor(point1(0), point1(1))), array(point2(0), point2(1), GetPixelColor(point2(0), point2(1))), array(point3(0), point3(1), GetPixelColor(point3(0), point3(1))) )
Dim currDengLongColorArr = array()
// 11 次循环
For i = 0 To 11
currDengLongColorArr = array( GetPixelColor(dengLongArr(i,0,0), dengLongArr(i,0,1)), GetPixelColor(dengLongArr(i,1,0), dengLongArr(i,1,1)), GetPixelColor(dengLongArr(i,2,0), dengLongArr(i,2,1)))
For j = 1 To 11
closeX ()
closeComm()
TracePrint "这一点"
dim str = dengLongArr(j,0,0)&"|"& dengLongArr(j,0,1) & "|" & currDengLongColorArr(0) & "-101010," & dengLongArr(j,1,0)&"|"& dengLongArr(j,1,1) & "|" & currDengLongColorArr(1) & "-101010," & dengLongArr(j,2,0)&"|"& dengLongArr(j,2,1) & "|" & currDengLongColorArr(2) & "-101010"
If Not(i = j) and CmpColorEx(str, 0.9 ) = 1 Then
TracePrint str & "找到没有" & i+1 & "->" & j+1
// 合并灯笼
heBingDengLongTouch (dengLongArr(i,0,0), dengLongArr(i,0,1), dengLongArr(j,0,0), dengLongArr(j,0,1))
//EndScript
//Exit For
Else
//TracePrint 0
End If
Next
Next
End Function
Function hebingDengLong2()
i = 0
j = 0
Dim temp
// 11 次循环
For i = 0 To 10
closeX ()
closeComm()
temp = i
For j = 0 To 10
heBingDengLongTouch (dengLongArr(temp,0,0), dengLongArr(temp,0,1), dengLongArr(j,0,0), dengLongArr(j,0,1))
temp = j
Next
Next
End Function
// 移动指定灯笼到第一位置
Function moveToFirst(number)
TracePrint "----------------------------" & number
TouchDown dengLongArr(number-1,0,0),dengLongArr(number-1,0,1), 1//按住屏幕上的100,100坐标不放,并设置此触点ID=1
TouchMove firstDengLong(0,0),firstDengLong(0,1), 1//将ID=2的触点花200毫秒移动至500,500坐标
TouchUp 1//松开弹起ID=1的触点
// TracePrint "移动力"
End Function
// 拖拽合并
Function heBingDengLongTouch(x1, y1, x2, y2)
TracePrint "----------------------------"
TouchDown x1,y1, 1//按住屏幕上的100,100坐标不放,并设置此触点ID=1
TouchMove x2, y2, 1//将ID=1的触点花200毫秒移动至500,500坐标
TouchUp 1//松开弹起ID=1的触点
End Function
// 关
Function closeX()
// 免费升级的点击
//各种弹层的关闭处理
End Function
Function closeComm()
// 也是各种弹层的关闭处理
End Function
Function isInGameWindow()
// 是否在游戏窗口的判断
End Function
// 广告处理
Function adProcc()
// 各种广告处理。。。。
TracePrint "开始广告处理................"
// 存在倒计时形式的x按钮
// 误入横版的app store 显示页面
End Function
// 脚本主函数
Function heBingDengLongMain()
For ii = 1 To 12
closeX ()
closeComm()
If hasShadowWindow() = False Then
// 原始的判断逻辑,效率低
hebingDengLong()
// 如果想用第二种合并处理逻辑的话,上面的For可以去掉,下面的moveToFirst()也要去掉
//hebingDengLong2()
moveToFirst (ii)
Else
TracePrint "不合并"
End If
Next
End Function
If isInGameWindow() = False Then
TracePrint "不在游戏界面"
ShowMessage "不在游戏界面"
Delay 2000
adProcc()
Else
heBingDengLongMain()
End If