基础模块

一个结构好的脚本,往往都是多个模块组成的,由模块来组合而成的代码,结构流程清晰便于阅读,不管是给其他人参考还是自己日后的维护,都是有很大帮助的。 虽然在不同的游戏里需要编写不同功能的模块,但是还有一些模块是可以通用的,这些模块编写好之后可以放在其他的脚本里使用。这种模块就被称为“基础模块” 一般情况下一个完整的脚本是有三大部分来组成的:**主程序模块、功能模块、基础模块** **主程序模块**就是用来实现脚本整体功能的,或者是用来控制脚本要执行什么功能的部分。比如LOL脚本使用他进行人机匹配还是统治战场模式,这个部分就属于主程序模块。他只负责进行全局的操作,不管细节。 **功能模块**就是用来具体实现某个功能的部分,还是以LOL脚本为例,像是实现人机匹配的战斗,识别血量等等这种操作都是功能模块的作用。 **基础模块**就是最基本的一些操作了,比如点击、找图、找色等等功能。这种基础模块往往和游戏本身没有关联,不会受到游戏的限制,可以随时放到其他的脚本中使用。 大家在编写脚本的过程中不要小看基础模块。别以为找图找色命令也就2、3行代码,封装和不封装感觉差不多。当你在代码中频繁的使用这些代码之后,你就会发现没封装成函数的话会让代码整体看上去非常的乱,到最后可能你自己都不知道写了什么东西。 所以~~要多封装函数!要多封装函数!要多封装函数! (重要的事情要说三遍) ## 滑屏模块 在安卓上滑屏是个比较频繁的操作,所以很有必要把他封装成函数。用Swipe 命令进行滑屏的话,很容易出现惯性,就是滑动停止后屏幕还是处于滑动状态,很不好控制,所以我们可以封装下面的这个函数实现滑屏 ``` Function 滑屏(x1,y1,x2,y2) TouchDown x1, y1,1 TouchMove x2, y2,1,200 TouchUp 1 Delay 200 End Function ``` #### 使用范例: ``` //把滑动的两个点记录到数组里方便调用 Call 滑屏(683, 945, 155, 974) ``` ## 点击模块 点击这种频繁的操作肯定是要封装的 ``` Function 点击(x,y) Tap x,y End Function ``` #### 使用范例: ``` Call 点击(169, 180) ``` ## 截屏到内存 在找色或者找图之前先使用KeepCapture 截屏到内存,可以加快找图找色的速度,所以我们可以把这个封装起来,在找图色之前调用一次 ``` Function 截屏(是否在循环中) If 是否在循环中 = true Then ReleaseCapture Delay 200 KeepCapture Else KeepCapture Delay 200 ReleaseCapture End If End Function ``` PS:这里为什么要先写 ReleaseCapture 这个释放截屏的命令呢? 这种写法可以利用到循环找图色结构当中。如果先写KeepCapture命令的话,那在循环结束后没有从内存信息中把图片释放掉,就会导致下一次的找图色失败,所以先释放一次,然后再截屏 #### 使用范例: ``` Do Call 截屏(true) FindPic 0, 0, 0, 0, "Attachment:1.png","000000",0, 0.8, intX, intY If intX >-1 then TracePrint "找到啦,坐标是"&intX&","&intY Else TracePrint "没找到" End If Loop ``` ## 通用找色模块 在安卓的实际编写过程中用的最多的就是多点找色,多点比色这样的命令了。所以可以把这些封装进去 ``` Function 通用找色(数组,相似度,找色是否点击) 通用找色 = False 找色是否点击 = False Dim intX,intY //多点找色 If (IsNumeric(数组(0)) = True) and (IsNull(数组(6)) = False) Then FindMultiColor 数组(0), 数组(1), 数组(2), 数组(3), 数组(4), 数组(5), 0, 相似度, intX, intY If intX > -1 Then 通用找色 = True If 找色是否点击 Then Tap intX,intY End If End If ElseIf IsNull(数组(1)) = True Then //多点比色 If CmpColorEx(数组(0), 相似度) = 1 Then 通用找色 = True End If End If End Function ``` 这样的函数可以根据传入的数组参数不同,同时兼容多点找色或者多点比色 #### 使用范例: ``` //867,359,956,445 这个是多点找色的范围 //多点找色 按钮A = Array(867,359,956,445,"A54C08","0|9|E5B500,0|48|A54C08,2|76|FFFFFF,117|143|2E2BE6") //多点比色 按钮B = Array("1039|1682|FFFDF3,1010|1685|FFF4B9,1032|1664|D67705,1005|1731|FD6E0A,990|1679|FFFFFB") If 通用找色(按钮A,0.8,false) = True Then TracePrint "多点找色找【按钮A】成功" ElseIf 通用找色(按钮B,0.8) = True Then TracePrint "多点比色找【按钮B】成功" End If ``` ## 取屏幕信息 ``` Function 取屏幕信息() Dim win_x,win_y,win_w,win_h win_x = GetScreenX() win_y = GetScreenY() TracePrint "当前分辨率:" & win_x & "*" & win_y win_w=win_x/1080 win_h=win_y/1920 TracePrint "屏幕比例:" & win_w & ":" & win_h End Function ```` ## 置屏幕信息 ```` Function 置屏幕信息(宽度,高度) If GetScreenX() <> 宽度 And GetScreenY() <> 高度 Then SetScreenScale 宽度,高度,0 End If End Function ```` ## 调试输出 ``` Function 调试输出(内容) TracePrint 内容 End Function ``` ## 判断应用是否已启动 脚本的易用性是推广脚本中遇到的大问题,你一样一样的添加功能的时候,用户可以很快接受,但是一开始没有接触过的用户,拿到你写的功能很庞大的脚本时,他甚至不知道如何下手。当然,你可以写上脚本的使用说明,这是一个不好不坏的主意,很多用户不喜欢看这个,他们很容易在根据界面上的文字勾选输入一番就运行,然后出现各种问题或者是没有反应,就认为此脚本不能用,然后。。。。就没有然后了。 因此,你需要做的是在用户启动的时候,智能的判断用户当前的状况并实施对应的方法回归到统一的地方然后开始进行脚本。打个比方,脚本的功能是自动过副本,起始点是主界面,如果用户使用的时候并不在主界面,那么有几种情况,最坏的一种是你的第一步操作并没有识别界面,于是就会导致功能完全错乱(不小心花掉了元宝之类的重要资源怎么办!),中等的结果就是你的每一步操作都有严格的判定,那么脚本运行的大部分情况是不做任何动作,当然这也不好,我们希望的是最好的结果,游戏自动回到主界面,然后就回到你的正常逻辑,这也是多个功能之间衔接的最佳办法----让他们有一个共同的起点(起始界面)。 每个应用的逻辑不同,起点也由你自己决定,但是我比较推荐的是,让脚本包含应用的自启动,这样我们就能够完美的控制每个用户的操作习惯差异性,当我们识别不到起点时,关闭应用再开启,识别到可回到起点的特征时。执行相关操作来回到起点。 使用此方式,判断应用的开启状态至关重要,我们可以使用GetRunningApp来获取运行中的应用列表,然后进行相关处理: ``` Function 启动应用(包名) Dim IsRunning = false Dim arr = GetRunningApp() For Each n In arr TracePrint n //遍历arr数组并输出所有获取的包名字符 If n = 包名 Then TracePrint "找到了,停止查找" IsRunning = true Exit For End If Next If IsRunning = false Then RunApp 包名 End If End Function ``` 如果不进行这样的判断就启动应用,重复的启动可能会导致应用崩溃。一个应用可能不止一个人做,因此,用心做好每一个细节和体验,能让你在竞争者中脱引而出。 ## 飞行模式切换IP ``` Function 飞行模式切换IP() TracePrint Device.GetIp() //开启飞行模式 Call ShanHai.OpenAirplane() Call 随机延时(1,5,"秒") //关闭飞行模式 Call ShanHai.CloseAirplane() Call 随机延时(5,10,"秒") TracePrint Device.GetIp() End Function ``` ## 随机延时 ``` Function 随机延时(最小值,最大值,单位) If 最小值 >= 最大值 Then ShowMessage "延时参数设定错误" End If If 单位 = "毫秒" Then ElseIf 单位 = "秒" Then 最小值= 最小值* 1000 最大值 = 最大值 * 1000 ElseIf 单位 = "分钟" Then 最小值= 最小值* 1000*60 最大值 = 最大值 * 1000*60 ElseIf 单位 = "小时" Then 最小值= 最小值* 1000*60*60 最大值 = 最大值 * 1000*60*60 End If Dim rndSecond rndSecond = Int(((最大值 - 最小值 + 1) * Rnd()) + 最小值) rndSecond = round(rndSecond/1000) //毫秒转换为秒 Call 倒计时提示(rndSecond) End Function ``` ## 倒计时提示 ``` //倒计时提示 //@second:秒数 Function 倒计时提示(second) Dim num=0 For second ShowMessage "等待:" &(second - num) & "秒" num = num + 1 Delay 1000 Next End Function ``` ## 取随机字母数字 ``` //@模式:0,大写+小写+数字;1,大写+小写;2,大写+数字;3,小写+数字;4,大写;5,小写;6,数字; Function 取随机字母数字(位数,模式) Dim i,位置,字符串="",字母 Dim 大写字母 = "ABCDEFGHJKLMNPQRSTUVWXYZ" Dim 小写字母 = "abcdefghijkmnpqrstuvwxyz" Dim 数字 = "123456789" //设置默认值 位数 = 6 模式 = 0 If 模式 = 0 Then 字母 = 大写字母 + 小写字母 + 数字 ElseIf 模式 = 1 Then 字母 = 大写字母 + 小写字母 ElseIf 模式 = 2 Then 字母 = 大写字母 + 数字 ElseIf 模式 = 3 Then 字母 = 小写字母 + 数字 ElseIf 模式 = 4 Then 字母 = 大写字母 ElseIf 模式 = 5 Then 字母 = 小写字母 ElseIf 模式 = 6 Then 字母 = 数字 End If For i=0 To 位数 - 1 位置 = Int((Len(字母) * Rnd()) + 1) 字符串 = 字符串 & Mid(字母,位置,1) Next 取随机字母数字 = 字符串 End Function ```