光遇脚本跑图怎么用(教你写手游脚本)

前言

经过前面2篇文章的学习理解,相信大家对游戏脚本有了一定的了解。今天我们就基于按键精灵的多点找色函数打造适用于我们自己的找色函数。

按键精灵的多点找色函数

/*这是按键精灵自身的多点找色函数,原理就是根据你提供的颜色描述去对找当前屏幕像素, 和指定的颜色进行对比,找到了就返回指定颜色的坐标,没找到就返回 -1, -1 x1,y1 : 要找区域左上角坐标 x2,y2 : 要找区域右下角坐标 first_color : 要对比的颜色,就是参考颜色,也是要返回的坐标颜色 offset_color : 要比对的多个点的颜色描述 dir : 查找方向,一般默认0,从左上到右下 sim : 对比相似度,一般默认0.9,再大不容易找到,太小容易找错 intX,intY : 返回的坐标 */ Dim intX, intY FindMultiColor(x1, y1, x2, y2, first_color, offset_color, dir, sim, intX, intY)

按键精灵给我们提供的这个函数只能满足基本需求,对我们而言还远远不够,我们期望能结合我们之前打造的点击函数结合起来进行使用。

开始打造非常棒的多点找色函数

初级设计:把多点找色当做判断条件

顾名思义,就是通过多点找色返回bool值,如果返回true我们做什么,如果返回false我们做什么,这样把函数当做判断条件会方便我们进行更多的动作。

//多点找色并返回真假 Function multiFindColor(x1, y1, x2, y2, first_color, offset_color) Dim intX, intY //定义2个变量 KeepCapture //截图保存至内存中,大幅度提升找色速度 FindMultiColor(x1, y1, x2, y2, first_color, offset_color, 0, 0.9, intX, intY) //固定寻找方向和相似度 ReleaseCapture //释放内存中的图片 If intX > -1 Then //点返回值大于-1说明找到坐标,函数返回真 multiFindColor = true Else multiFindColor = false End If End Function

实例:找雷电中心

光遇脚本跑图怎么用(教你写手游脚本)(1)

寻找雷电游戏中心

复制右侧的"选取范围"内容和"多点找色-颜色描述"的内容

//打印函数返回内容 TracePrint multiFindColor(230, 207, 323, 294, "1FC5F4", "0|-13|000000,-23|-37|1FC5F4,22|-31|1FC5F4,1|-15|000000")

进阶设计:需要返回坐标方便我们配合点击函数

有时候我们找到了目标,还希望能把那个目标的坐标值也给我们,方便我们调用click函数,这时候我们需要再造一个能返回坐标的函数。

疑惑1:为什么我没有把点击函数写入找色函数里面?

为了解除函数与函数之间的耦合性,或者说达到一个松耦合的效果,什么叫耦合?就是相互关联性,一个独立的函数适用性远远大于一个关联紧密的函数。

疑惑2:这么设计有什么好处?

假设你想要找的目标是右上角,而你要点击的地方是左下角,这时候使用这个函数就非常棒,我们只要专注找色就是找色,点击就是点击就可以了。

/*多点找色并返回坐标 x1,y1 : 要找区域左上角坐标 x2,y2 : 要找区域右下角坐标 first_color : 要对比的颜色,就是参考颜色,也是要返回的坐标颜色 offset_color : 要比对的多个点的颜色描述 */ Function colorPoint(x1, y1, x2, y2, first_color, offset_color) Dim intX, intY, retArray //定义3个变量 KeepCapture //截图保存至内存中,大幅度提升找色速度 FindMultiColor(x1, y1, x2, y2, first_color, offset_color, 0, 0.9, intX, intY) //固定寻找方向和相似度 ReleaseCapture //释放内存中的图片 If intX > -1 Then //找到目标返回数组 retArray = Array(intX, intY) Else //没找到目标返回-1,-1 retArray = Array(-1, -1) End If //返回retArray数组 colorPoint = retArray End Function //根据返回坐标数组进行点击动作 Dim ret, x, y //用上面雷电的特征信息做例子 ret = colorPoint(230, 207, 323, 294, "1FC5F4", "0|-13|000000,-23|-37|1FC5F4,22|-31|1FC5F4,1|-15|000000") x = ret(0) y = ret(1) //TracePrint x,y click(x 60, y 350, 5) //最后点击了剪映

实例:我想通过雷电的图标来定位,但是最后点击的必须是剪映的位置

光遇脚本跑图怎么用(教你写手游脚本)(2)

通过雷电中心找剪映

很多时候因为游戏的不规则性,我们想找的目标是漂浮不定或者透明无法确定的,这时候我们就需要找到其他静态的其他区域来帮我辅助完成动作。

这样设计也有弊端:

由于按键精灵无法直接返回多个返回值,所以只能通过数组的方式接收和传出。这并不是一个很理想的设计,显得很繁琐。虽然解除了函数之间的耦合性,但是增加了需要编写的代码量,不过从实际使用来来说,因为使用频次不高,又能有效解决无法直接定位的问题,这依然是一个不错的设计。(也可以用一个sub来把这个流程包裹起来。)

Sub 依雷电找剪映() //根据返回坐标数组进行点击动作 Dim ret, x, y //用上面雷电的特征信息做例子 ret = colorPoint(230, 207, 323, 294, "1FC5F4", "0|-13|000000,-23|-37|1FC5F4,22|-31|1FC5F4,1|-15|000000") x = ret(0) y = ret(1) //TracePrint x,y click(x 60, y 350, 5) //最后点击了剪映 End Sub call 依雷电找剪映()

终极设计:对于只能找动态图,时不时又找不到目标,怎么办?

这是一个比较少见的特殊情况,但是不排除这种情况的存在。

最近在做的一款游戏就经常碰到这样的情况,整个页面都是画上去的,同一个界面每次找色都不一样,不过由于使用的不是按键精灵解决方案,很快就把这个问题解决了。

设计一个函数,使用循环对一个存储了找色数据的数组进行遍历找色,找到了返回真假,或者返回坐标。

暂时没找到比较有效的实现方法,一是由于按键精灵是基于VB设计的产物,上个世纪的老语言,很多时候设计都有局限性;二是有我自身的技术有限无法找到一个相对很棒的实现方法。

那遇到这样的情况怎么办?

1. 更换解决方案,不使用按键精灵,换其他方式;

2. 尽可能的去找静态稳定的目标;

结语:

在设计函数时,我们应该更多的考虑函数的可扩展性和复用性,而不是单纯的把一串代码拼凑起来,这样一没设计感,二没有灵魂!要记住没有最好的代码,只有适用的代码。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页