按键精灵制作脚本教程 新手教程——按键精灵脚本来模拟合成灯笼
下图是某游戏的合成灯笼界面,通过拖拽把相同的灯笼合成更高一级的灯笼。我想用脚本来自动合成,完全自动化。

下图是实现后的效果:
通过脚本大大提高合成速度!
其实这里并不是用到反编译和逆向的知识,只是用了按键精灵写了模拟合成的脚本,本篇文章就先讲按键精灵的使用吧,反编译的其他知识后面我会逐一分享,因为这个按键精灵也是我这段时间折腾的一部分。
进入正题
折腾吧。
环境要求与即将使用的工具
环境版本
操作系统
本人的mac是双系统(MacOSX和Win7),按键精灵脚本需要在Windows开发
按键精灵手机助手 for Windows
3.5.2
按键精灵iOS版
1.5.2
手机系统
iPhone7 iOS11 需要越狱
思路
一开始我的做法:
怎么让脚本知道是两个相同的灯笼,然后又怎么模拟灯笼拖拽去合并?我想到了按键精灵,早起用过电脑版的用来辅助游戏,想不到现在有手机版的了!所以想看看怎么弄,我基本也是从零学起的。
了解按键精灵 iOS 版可以模拟我们人手的任何触摸指令,我就有信心做这个合成判断了,按键精灵的代码是MQ语言按键精灵制作脚本教程,有相关手册大家可以去看。
思路是把 12 个灯笼区域分割成 12 个区域,坐标存放在数组中,然后拿每一个灯笼来和第一个灯笼比较特征卡盟,特征相同就触发模拟拖拽合并。
另一种做法:用冒泡算法不判断色点,简单粗暴每个格子都移动合并,不管是不是相同灯笼,没想到效率更高!代码更简单效率更快!


实现代码
这里只列出核心代码,具体代码见:github
()
ShowMessage "启动脚本。。。。。"// 横屏//x//|__ yDim offsetX = 260Dim offsetY = 292Dim 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 2dim j = 0For j = 0 To 3dengLongArr(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 + 1NextNext// 合并灯笼Function heBingDengLong()i = 0j = 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 11currDengLongColorArr = 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 11closeX ()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 ThenTracePrint str & "找到没有" & i+1 & "->" & j+1// 合并灯笼heBingDengLongTouch (dengLongArr(i,0,0), dengLongArr(i,0,1), dengLongArr(j,0,0), dengLongArr(j,0,1))//EndScript//Exit ForElse//TracePrint 0End IfNextNextEnd FunctionFunction hebingDengLong2()i = 0j = 0Dim temp// 11 次循环For i = 0 To 10closeX ()closeComm()temp = iFor j = 0 To 10heBingDengLongTouch (dengLongArr(temp,0,0), dengLongArr(temp,0,1), dengLongArr(j,0,0), dengLongArr(j,0,1))temp = jNextNextEnd Function// 移动指定灯笼到第一位置Function moveToFirst(number)TracePrint "----------------------------" & numberTouchDown dengLongArr(number-1,0,0),dengLongArr(number-1,0,1), 1//按住屏幕上的100,100坐标不放,并设置此触点ID=1TouchMove 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=1TouchMove x2, y2, 1//将ID=1的触点花200毫秒移动至500,500坐标TouchUp 1//松开弹起ID=1的触点End Function// 关Function closeX()// 免费升级的点击//各种弹层的关闭处理End FunctionFunction closeComm()// 也是各种弹层的关闭处理End FunctionFunction isInGameWindow()// 是否在游戏窗口的判断End Function// 广告处理Function adProcc()// 各种广告处理。。。。TracePrint "开始广告处理................"// 存在倒计时形式的x按钮// 误入横版的app store 显示页面End Function// 脚本主函数Function heBingDengLongMain()For ii = 1 To 12closeX ()closeComm()If hasShadowWindow() = False Then// 原始的判断逻辑,效率低hebingDengLong()// 如果想用第二种合并处理逻辑的话,上面的For可以去掉,下面的moveToFirst()也要去掉//hebingDengLong2()moveToFirst (ii)ElseTracePrint "不合并"End IfNextEnd FunctionIf isInGameWindow() = False ThenTracePrint "不在游戏界面"ShowMessage "不在游戏界面"Delay 2000adProcc()ElseheBingDengLongMain()End If
 
  
  
  
  
 