最近肝的游戏越来越多,其中有一些游戏的刷素材过程和看录像完全没有区别(点名xx方舟),于是又开始写自动操作脚本,完了想想不如水一篇博客,就有了这玩意。
本文适合没有基础但是能折腾的朋友阅读,不过能稍微看一下JavaScript的基础教程更好。编写出的脚本也仅适用于游玩过程本身自动化,只需要重复点击几个固定按钮的游戏。不过看完后得到启发能写出更复杂的脚本也说不定(
开始前让我们先了解一些基础的东西:什么是auto.js,以及它是如何工作的。我们来看看官网的描述(这段描述是auto.js专业版的描述,不过在这教程里免费版就足够使用了,文末会给出下载链接)
总结一下就是这玩意能模拟人类进行很多自动操作。与其类似的软件还有脚本精灵,按键精灵等等,但是他们在安卓生态上已经死了,完全无法在高版本API上运行,而且需要root。auto.js的点按是基于无障碍服务的,无需root,但需要安卓7.1以上版本,不过现在能跑游戏的主流安卓设备估计都到7.1以上了,问题不大。
接下来让我们想想在肝游戏(指看录像)时我们是怎么做的:时不时看一下屏幕→看到按钮→点击按钮→时不时看一下屏幕...如此不断循环。而我们的脚本也可以按照这个逻辑来运行。那么我们就可以写出以下非常伪的伪代码:
WHILE 真
IF 检测到按钮一 THEN 点击按钮一
ELSE 什么都不做
END IF
IF 检测到按钮二 THEN 点击按钮二
ELSE 什么都不做
END IF
......
WEND
那么如何检测按钮又如何点击按钮呢?让我们看看auto.js的官方文档:
嗯,可能很多人觉得一脸懵逼,但是我们只需要知道captureScreen()函数可以截图,images.detectsColor()可以在截图中找色,click()可以模拟屏幕点击就足够了。接下来按照我们的想法,我们应该确定好各个按钮的位置,以明日方舟为例,有选关界面的开始作战按钮,干员编成界面的开始作战按钮和结算界面(固定以颜色不会变的地方来判断)。因为8位RGB颜色非常丰富,几乎不存在颜色完全一致的可能,所以我们只需要在这些按钮上选择一个点,当这个点的颜色和按钮出现时这个点的颜色一致,就可以判断这个按钮已经出现,需要被点击了。观察下函数的结构,我们可以写出以下不那么伪的伪代码:
/*
img:通过captureScreen获得的图片对象
color:欲匹配的颜色RGB值
ran:点击时的坐标误差,用于防止封号
id:用于toast提示检测并点击目标坐标
delay:点击后的间隔时间,避免多次点击
colorx;colory:欲检测颜色的屏幕坐标
clickx;clicky:检测到颜色匹配时的点击坐标,如果和点击坐标相同则无需传入
*/
function detectAndClick(img, color, ran, id, delay, colorx, colory, clickx, clicky) {
if (images.detectsColor(img, color, colorx, colory)) { //判断指定坐标颜色是否与目标颜色相符
toast(id); //发现按钮的提示
if (arguments.length == 9) {
click(clickx + random(-ran, ran), clicky + random(-ran, ran)); //点击目标按钮
}
if (arguments.length == 7) {
click(colorx + random(-ran, ran), colory + random(-ran, ran)); //重载,点击
}
sleep(delay);//休眠
}
}
setScreenMetrics(1080, 2232) //锁定屏幕分辨率
requestScreenCapture(true) //得到截图权限
while (true) {
nowimg = captureScreen()
detectAndClick(nowimg, "#FFFFFF", 120, "点击画面", 50, 1122, 873)
}
前面三行代码调用的函数的作用分别是请求无障碍权限,锁定屏幕分辨率和请求截图权限,这些函数几乎是图色操作脚本所必备的。以上代码就可以实现循环检测屏幕上出现的按钮并进行点击,这样我们实际上就已经编写出来了一份能跑的游戏脚本,只需要将函数中的参数一一填空写好就完工了。但是如何获取图片相应坐标的颜色值呢?
我个人使用Iconcraft完成这个工作,这玩意本来是用于制作ico图标的,所以优化不是很好,但是我懒得找了,反正也能用,就这样吧。
将图片按照原分辨率导入,接下来将鼠标放在按钮上,软件的下方就会显示出相应的坐标和RGB颜色值(如下图),将所有需要检测和点击的坐标都找出来放到代码里就OK了。
这样我们就完成整个脚本的制作了,但是这样编写的脚本会反复进行截图,导致性能和电量的浪费,我们可以将这个流程封装在函数中,通过反复调用来简化代码和避免重复截图:
/*
img:通过captureScreen获得的图片对象
color:欲匹配的颜色RGB值
ran:点击时的坐标误差,用于防止封号
id:用于toast提示检测并点击目标坐标
delay:点击后的间隔时间,避免多次点击
colorx;colory:欲检测颜色的屏幕坐标
clickx;clicky:检测到颜色匹配时的点击坐标,如果和点击坐标相同则无需传入
*/
function detectAndClick(img, color, ran, id, delay, colorx, colory, clickx, clicky) {
if (images.detectsColor(img, color, colorx, colory)) { //判断指定坐标颜色是否与目标颜色相符
toast(id); //发现按钮的提示
if (arguments.length == 9) {
click(clickx + random(-ran, ran), clicky + random(-ran, ran)); //点击目标按钮
}
if (arguments.length == 7) {
click(colorx + random(-ran, ran), colory + random(-ran, ran)); //重载,点击
}
sleep(delay);//休眠
}
}
setScreenMetrics(1080, 2232) //锁定屏幕分辨率
requestScreenCapture(true) //得到截图权限
while (true) {
nowimg = captureScreen()
//此处调用函数来循环检测点击按钮
//e.g:detectAndClick(nowimg, "#FFFFFF", 120, "点击画面", 50, 1122, 873)
}
这样一个虽然简陋但是能用的脚本就编写完成了,接下来我们可以将脚本保存,并导入到auto.js软件中并启动,就可以让脚本帮我们代肝游戏了。这篇文章就到这里,第一次写长文。。。。算是改变一下风格吧,入门autojs脚本编程还是挺简单的,如果想了解更多可以先去看看runoob的JavaScript教程和autojs的官方文档。
auto.js下载链接:手机无了,暂时上传不了(逃