前一段时间微信小游戏跳一跳很火,那时候也玩了,但是一直没法突破高分,所以就想能不能写一个脚本自动操作。
在这个想法之前,曾想过要做一个脚本,用于破解某一家公司的微信游戏(跟别踩白块的玩法一样)刷分。但是不能同时具备跨应用和快速度,最后失败了,但是这次的实践,积累了图片处理和截屏方面的技术知识,在跳一跳的游戏脚本制作上就有很好的发挥空间。
在内容开始的之前,本人在此声明,MediaProjection部分是借助别人的代码,但是图片技术处理是利用自己的技术储备。同时由于个人兴趣所做,效果可以刷分但是防作弊做的不好,容易被检测到作弊嫌疑,因此本博文只能作为技术交流,不能作为真正的刷分之用。有兴趣的可以考虑解决防作弊方案。
效果图
脚本的制作思路
首先、我们对MediaProjection进行简要的说明,MediaProjection是Android 5.0 之后开放的屏幕截屏和屏幕录制功能,在使用的时候,只要检测手机是否有授权此功能,然后授权即可(详细的可以查看别人的分析)。得到授权之后,我们设置悬浮框,打开微信的跳一跳小游戏,点击悬浮框,截屏并获取该图的资源(图片处理的原始数据)。原图(分辨率:1920*1080)如下:
图1 原图
图片基本处理的流程
获取图片资源-->将图片压缩(取样)-->图片灰度化(作为下一处理过程的原数据)
图片的压缩(取样)
在这个步骤中我们获取每3*3获取一个样本点。压缩之后的图片宽度和高度均为原来的1/3,可以大大减少图片的处理速度。压缩完的图片分辨率还是足以满足后续的扣模型和寻找着地点位置坐标的需求。压缩代码如下,压缩结果如下(右边图,点击查看大图可以看出有失真):
/**
* 将图片的大小缩小为原来的1/9(九个样本点取一点)
* @param pixels 缩小之后的图片
* @param oldPixels 原图片的数据
* @param width 缩小之后的图片的宽度
* @param height 缩小之后的图片的高度
*/
public void narrow(int[] pixels,int[] oldPixels,int width,int height){
for(int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
pixels[i*width + j] = oldPixels[i*width*9 + j*3];
}
}
}