[关闭]
@xxzhushou 2017-07-21T05:46:57.000000Z 字数 63635 阅读 202294

叉叉脚本开发手册

叉叉脚本

引擎版本:1.8.30

前言

  叉叉脚本使用 Lua 语言进行编写,支持Lua的所有语法与基本函数,配合叉叉脚本特有的函数命令,实现找图、找色、触摸等高级功能。
  编写脚本前请先学习 lua 的基本语法。
  Lua官方手册:http://www.lua.org/manual/5.1/
  Lua中文开发手册:http://book.luaer.cn/
  叉叉开发者平台:http://dev.xxzhushou.cn/
特别注意:

1.由于安全性方面的考虑,以下函数在叉叉脚本中不予以支持:
debub库所有函数、io.tmpfile、io.popen、os.execute、os.exit、os.remove、os.rename、os.tmpname
2.io.open的用法比较特殊,参数中不能填写具体路径,只能是文件名,比如:
io.open('aa.txt') 是正确的,io.open('../../../aa.txt')则运行会报错。
另外,io库支持公共文件夹,比如io.input('[public]xx.txt'),就会在[tengine]/public下读取xx.txt这个文件。

脚本文件格式支持说明:

叉叉助手/IPA精灵 开发助手 说明 生成方式
xsp0 不支持 支持 主要用于开发调试,没有加密处理 IDE生成或者打包工具
xsp1 支持 支持 主要用于不开源的脚本免费分享,有加密处理 上传后台直接加密
xsp2 支持 不支持 在国内开发者平台上架后,下载到叉叉助手,动态加密 在用户下载时生成

 *iOS可使用ifunbox等工具将脚本文件复制到设备

开发文件夹路径

本地脚本存放路径

公共文件夹路径

截图存放路径

脚本开发实用技巧(持续更新)

戳这里:https://www.zybuluo.com/xxzhushou/note/726742

叉叉脚本定制版发布指引

戳这里:https://www.zybuluo.com/xxzhushou/note/755911

iOS免越狱接口说明:适配免越狱引擎必读

API接口 支持状态 说明
isPriviateMode 新增 返回值1、0;1-越狱/root环境;0-免越狱/免root环境;
runApp 运行应用 不支持 无效,返回非0
closeApp 关闭应用 不支持 无效,无返回值
setWifiEnable 设置无线局域网开关 不支持 无效,返回false
setAirplaneMode 设置飞行模式开关 不支持 无效,返回false
setBTEnable 设置蓝牙开关 不支持 无效,返回false
lockDevice 锁定设备 不支持 无效,无返回值
unlockDevice 解锁设备 不支持 无效,无返回值
deviceIsLock 设备锁定状态 不支持 无效,返回0-回未锁定
pressHomeKey 模拟主屏幕按键 不支持 无效,无返回值
doublePressHomeKey 双击HOME键 不支持 无效,无返回值
appIsRunning 检测应用是否运行 支持,有修改 参数包名是该游戏返回1-目标应用运行中,否则返回0-目标应用未运行
isFrontApp 判断是否为前台应用 支持,有修改 参数包名是该游戏返回1-在前台,否则返回0-不在前台
frontAppName 获取前台应用识别ID 支持,有修改 只能返回重打包游戏的包名
其他接口 支持

函数:init 初始化

函数功能:脚本使用触摸函数前必须调用,以指定应用程序以及坐标系
函数语法:
  init(appid, rotate)

参数说明:

参数 类型 说明
appid 文本型 目标程序的应用ID,当填写"0"时,自动使用当前运行的应用
rotate 整数型 屏幕方向,0 - 竖屏, 1 - Home键在右边, 2 - Home键在左边

返回值:无

脚本实例:

  1. init("com.apple.Music", 0); --以应用 "com.apple.Music" 竖屏初始化
  2. init("0", 1); --以当前应用 Home 键在右初始化

函数:touchDown 触摸按下

函数功能:发送触摸事件
函数语法:
  touchDown(index, x, y)

参数说明:

参数 类型 说明
index 整数型 手指序号,用于多点触控中标记多只手指,分别控制它们的移动
x,y 整数型 屏幕坐标

返回值:无

脚本实例:

  1. touchDown(1, 150, 150) --ID1的手指在坐标(150,150)处按下
  2. mSleep(200) --延时200毫秒
  3. touchUp(1, 150, 150) --ID1的手指抬起
  1. function tap(x, y)
  2. touchDown(0, x, y);
  3. mSleep(200);
  4. touchUp(0, x, y);
  5. end
  6. tap(100,100); --调用:点击坐标为100,100的点

注意事项:

需要注意的是在使用 touchDown、touchUp 函数时,中间一定要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。

函数:touchMove 移动

函数功能:发送触摸事件
函数语法:
  touchMove(index, x, y)

参数说明:

参数 类型 说明
index 整数型 手指序号,用于多点触控中标记多只手指,分别控制它们的移动
x,y 整数型 屏幕坐标

返回值:无

脚本实例:

  1. touchDown(1, 150, 150); --ID1的手指在 (150, 150) 按下
  2. mSleep(50);
  3. touchMove(1, 150, 400); --移动到 (150, 400)
  4. mSleep(50);
  5. touchUp(1, 150, 400); --在 (150, 400) 抬起
  1. touchDown(1, 150, 550); --在 (150, 550) 按下
  2. for i = 0, 200, 10 do --使用for循环连续滑动
  3. touchMove(1, 150 + i, 550);
  4. mSleep(150); --延迟
  5. end
  6. touchUp(1, 150 + 200, 550); --在 (350, 550) 抬起
  1. touchDown(1, 100, 100); --ID1的手指在 (100, 100) 按下
  2. touchDown(2, 300, 500); --ID2的手指在 (300, 500) 按下
  3. mSleep(50);
  4. for i = 1, 100, 1 do --使用 for 循环使两只手指向不同方向分离
  5. touchMove(1, 200 - i, 400 - i);
  6. touchMove(2, 300 + i, 500 + i);
  7. mSleep(50);
  8. end
  9. touchUp(1, 200 - 100, 400 - 100);
  10. touchUp(2, 300 + 100, 500 + 100); --分别抬起2只手指

注意事项:

需要注意的是在使用 touchDown、touchUp 函数时,中间一定要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。

函数:touchUp 触摸抬起

函数功能:发送触摸事件
函数语法:
  touchUp(index, x, y)

参数说明:

参数 类型 说明
index 整数型 手指序号,用于多点触控中标记多只手指,分别控制它们的移动
x,y 整数型 屏幕坐标

返回值:无

脚本实例:

  1. touchDown(1, 150, 150); --ID1的手指在 (150, 150) 按下
  2. mSleep(50);
  3. touchMove(1, 150, 400); --移动到 (150, 400)
  4. mSleep(50);
  5. touchUp(1, 150, 400); --在 (150, 400) 抬起
  1. touchDown(1, 150, 550); --在 (150, 550) 按下
  2. for i = 0, 200, 10 do --使用for循环连续滑动
  3. touchMove(1, 150 + i, 550);
  4. mSleep(150); --延迟
  5. end
  6. touchUp(1, 150 + 200, 550); --在 (350, 550) 抬起
  1. touchDown(1, 100, 100); --ID1的手指在 (100, 100) 按下
  2. touchDown(2, 300, 500); --ID2的手指在 (300, 500) 按下
  3. mSleep(50);
  4. for i = 1, 100, 1 do --使用 for 循环使两只手指向不同方向分离
  5. touchMove(1, 200 - i, 400 - i);
  6. touchMove(2, 300 + i, 500 + i);
  7. mSleep(50);
  8. end
  9. touchUp(1, 200 - 100, 400 - 100);
  10. touchUp(2, 300 + 100, 500 + 100); --分别抬起2只手指

注意事项:

需要注意的是在使用 touchDown、touchUp 函数时,中间一定要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。

函数:catchTouchPoint 获取用户点击坐标

函数功能:调用该函数后,将等待用户完成一次或多次屏幕点击,并返回点击的坐标
函数语法:
  results = catchTouchPoint(touchCount)
  x,y = catchTouchPoint()

参数说明:

参数 类型 说明
touchCount 整数型 所需获取的 点/坐标 个数
返回值 类型 说明
x,y 整数型 单次点击时,返回该点击对应的屏幕坐标
results table型 当touchCount参数有效时,将返回一个包含所有点击坐标的table

脚本实例:

  1. dialog("请点击屏幕一次", 0);
  2. x,y = catchTouchPoint();
  3. mSleep(1000);
  4. dialog("x:"..x.." y:"..y, 0);
  1. local results = catchTouchPoint(3);
  2. for i = 1, #results do
  3. sysLog("第"..i.."个坐标为:"..i..",x="..results[i].x..",y="..results[i].y);
  4. end

注意事项:

1.此函数触发后将一直等待用户完成屏幕点击,并阻止脚本继续运行。
2.此函数获取到的坐标为竖屏坐标,横屏情况需要自行转换。
3.此函数有较小的延迟,连续点击时,请勿点击过快。

函数:findColor 区域多点找色(推荐使用)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找
函数语法:
    x, y = findColor(
     {left, top, right, bottom},
     color0,
     degree,
     hdir,
     vdir,
     priority
    )
    
    x, y = findColor(
     {left, top, right, bottom},
     "x0|y0|color0,x1|y1|color1(|degree1),x2|y2|color2(-offset2),...",
     degree,
     hdir,
     vdir,
     priority
    )
    
    x, y = findColor(
     {left, top, right, bottom},
     {
      {x = x0, y = y0, color = color0},
      {x = x1, y = y1, color = color1, (degree = degree1)},
      {x = x2, y = y2, color = color2, (offset = offset2)},
      ...
     },
     degree,
     hdir,
     vdir,
     priority
    )

参数说明:

参数 类型 说明
left, top 整数型 [必填]寻找区域左上角顶点屏幕坐标
right, bottom 整数型 [必填]寻找区域右下角顶点屏幕坐标
x0,y0 整数型 [必填]起始点坐标值,填写0,0时使用相对坐标体系,填写非0坐标则根据所填绝对坐标换算
color0 整数型 [必填]起始点颜色的十六进制颜色值
x1,y1 整数型 [选填]偏移位置的坐标值
color1 整数型 [选填]偏移位置需要匹配颜色的十六进制颜色值
degree1 整数型 [选填]偏移位置找色精度,范围:1 ~ 100,当是100时为完全匹配
offset1 整数型 [选填]偏移位置找色偏色值,十六进制颜色值,当是000000时为完全匹配
degree 整数型 [必填]全局找色精度,范围:1 ~ 100,当是100时为完全匹配
hdir 整数型 [选填]水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 [选填]垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
priority 整数型 [选填]搜索优先级,0表示水平优先,1表示垂直优先,默认为0

说明:
1.起始点坐标值填写0,0时,偏移位置坐标值使用相对坐标;填写为非0,0的坐标时,则认为偏移位置坐标为绝对坐标,找色时,将根据填写的绝对坐标换算出的相对坐标进行寻找。
2.偏移位置颜色的偏色值或精度可任意选用,同时填写了偏色值和精度时,将以偏色为准,忽略精度值。
3.个别偏移位置颜色偏色值或精度优先于全局找色精度,全局找色精度对未指定偏色或精度的颜色有效。

返回值 类型 说明
x,y 整数型 找到的点坐标,如未找到则返回 -1,-1

脚本实例:

  1. x, y = findColor({50, 50, 300, 300},0x112233)
  2. if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点
  3. touchDown(1, x, y); --点击该点
  4. mSleep(50)
  5. touchUp(1, x, y);
  6. else --如找不到符合条件的点
  7. dialog("没找到你要的坐标呢",0);
  8. end

使用以上方法找色时,常常会因为屏幕上有大量符合指定颜色的点而不能找到需要的坐标。该函数通过在寻找到一个符合指定颜色color的坐标后,进一步确认其周边点坐标的方式,来确定准确目标。例如,现在我们在图像上找到了我们需要的一个按钮,这个按钮的样式是不变的,但是它的整体位置却会在整个屏幕上变化,现在我们想要在脚本运行时得到其坐标。

首先确定一个参照点:
颜色为 0x181F85,坐标为 (268, 802),下表序号1。
记录下来,继续寻找周边的几个参照点,以及与第一个参照点的相对坐标,分别为下表序号2~4:

现在我们找到了需要的所有参照点:

序号 颜色 坐标 相对坐标
1 0x181F85 (268, 802) (0, 0)
2 0x00BBFE (297, 803) (29, 1)
3 0x0B6BBE (371, 798) (103, -4)
4 0x150972 (333, 811) (65, 9)

应用上述坐标写成多点找色脚本(以下4种任选1种):

  1. x, y = findColor(
  2. {0, 0, 639, 959},
  3. "0|0|0x181F85,29|1|0x00BBFE|90,103|-4|0x0B6BBE-0x050505,65|9|0x150972")
  4. x, y = findColor(
  5. {0, 0, 639, 959},
  6. {
  7. {x = 0, y = 0, color = 0x181F85},
  8. {x = 29, y = 1, color = 0x00BBFE, degree = 90},
  9. {x = 103, y = -4, color = 0x0B6BBE, offset = 0x050505},
  10. {x = 65, y = 9, color = 0x150972}
  11. })
  1. x, y = findColor(
  2. {0, 0, 639, 959},
  3. "268|802|0x181F85,297|803|0x00BBFE|90,371|798|0x0B6BBE-050505,333|811|0x150972")
  4. x, y = findColor(
  5. {0, 0, 639, 959},
  6. {
  7. {x = 268, y = 802, color = 0x181F85},
  8. {x = 297, y = 803 color = 0x00BBFE, degree = 90},
  9. {x = 371, y = 798 color = 0x0B6BBE, offset = 0x050505},
  10. {x = 333, y = 811 color = 0x150972}
  11. })

新旧多点找色API对比:

  1. findColorInRegionFuzzy = function(tcolor, degree, x1, y1, x2, y2, hdir, vdir)
  2. return findColor(
  3. {x1, y1, x2, y2},
  4. tcolor,
  5. degree,
  6. hdir or 0,
  7. vdir or 0
  8. )
  9. end
  10. findMultiColorInRegionFuzzy = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
  11. posandcolors = string.format("0|0|0x%x,%s", tcolor, posandcolors)
  12. return findColor(
  13. {x1, y1, x2, y2},
  14. posandcolors,
  15. degree,
  16. hdir or 0,
  17. vdir or 0
  18. )
  19. end
  20. findMultiColorInRegionFuzzy2 = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
  21. table.insert(posandcolors, 1, {x = 0, y = 0, color = tcolor})
  22. return findColor(
  23. {x1, y1, x2, y2},
  24. posandcolors,
  25. degree,
  26. hdir or 0,
  27. vdir or 0
  28. )
  29. end

关于搜索方向:

hdir vdir priority 区域搜索路径
0 0 0 左上角 -> 右上角 -> 左下角 -> 右下角
0 0 1 左上角 -> 左下角 -> 右上角 -> 右下角
0 1 0 左下角 -> 右下角 -> 左上角 -> 右上角
0 1 1 左下角 -> 左上角 -> 右下角 -> 右上角
1 0 0 右上角 -> 左上角 -> 右下角 -> 左下角
1 0 1 右上角 -> 右下角 -> 左上角 -> 左下角
1 1 0 右下角 -> 左下角 -> 右上角 -> 左上角
1 1 1 右下角 -> 右上角 -> 左下角 -> 左上角

注意事项:

1.未找到则返回 (-1, -1) ,所以找到时 x, y 均不等于 -1,~= 为不等于操作符,是 Lua 基本语法, 属于逻辑控制。
2.该代码应用过程中,建议使用"保持屏幕"优化找色速度。
3.颜色值的十六进制文本中,其顺序为RGB。
4.相对坐标为偏移位置坐标相对于第一个点的坐标,即用这个点的横坐标、纵坐标分别减去第一个点的横坐标、纵坐标,可以为负数。
5.使用此函数时精度参数设置过低或允许的偏色多大,会导致性能大幅下降。
6.支持引擎版本:1.8.30或更新

函数:findColors 高级区域多点找色(推荐使用)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找
函数语法:
  point = findColors(
   {left, top, right, bottom},
   color0,
   degree,
   hdir,
   vdir,
   priority,
  )
  
  point = findColors(
   {left, top, right, bottom},
   "x0|y0|color0,x1|y1|color1(|degree1),x2|y2|color2(-offset2),...",
   degree,
   hdir,
   vdir,
   priority,
  )
  
  point = findColors(
   {left, top, right, bottom},
   {
   {x = x0, y = y0, color = color0},
   {x = x1, y = y1 color = color1, (degree = degree1)},
   {x = x2, y = y2 color = color2, (offset = offset2)},
   ...
   },
   degree,
   hdir,
   vdir,
   priority,
  )

参数说明:

参数 类型 说明
left, top 整数型 [必填]寻找区域左上角顶点屏幕坐标
right, bottom 整数型 [必填]寻找区域右下角顶点屏幕坐标
x0,y0 整数型 [必填]起始点坐标值,填写0,0时使用相对坐标体系,填写非0坐标则根据所填绝对坐标换算
color0 整数型 [必填]起始点颜色的十六进制颜色值
x1,y1 整数型 [选填]偏移位置的坐标值
color1 整数型 [选填]偏移位置需要匹配颜色的十六进制颜色值
degree1 整数型 [选填]偏移位置找色精度,范围:1 ~ 100,当是100时为完全匹配
offset1 整数型 [选填]偏移位置找色偏色值,十六进制颜色值,当是000000时为完全匹配
degree 整数型 [必填]全局找色精度,范围:1 ~ 100,当是100时为完全匹配
hdir 整数型 [选填]水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 [选填]垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
priority 整数型 [选填]搜索优先级,0表示水平优先,1表示垂直优先,默认为0

说明:
1.起始点坐标值填写0,0时,偏移位置坐标值使用相对坐标;填写为非0,0的坐标时,则认为偏移位置坐标为绝对坐标,找色时,将根据填写的绝对坐标换算出的相对坐标进行寻找。
2.偏移位置颜色的偏色值或精度可任意选用,同时填写了偏色值和精度时,将以偏色为准,忽略精度值。
3.个别偏移位置颜色偏色值或精度优先于全局找色精度,全局找色精度对未指定偏色或精度的颜色有效。

返回值 类型 说明
point table类型 以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空

返回的 table 为key-value的形式,如下:
point = {
 {x = 100,y = 110},
 {x = 200,y = 210},
 {x = 300,y = 310},
 ...
}

脚本实例:

  1. point = findColors(
  2. {0, 0, 639, 959},
  3. 0x181F85)
  4. if #point ~= 0 then --如果找到符合条件的点
  5. for var = 1, #point do
  6. sysLog(point[var].x..":"..point[var].y)
  7. end
  8. end
  9. point = findColors(
  10. {0, 0, 639, 959},
  11. "0|0|0x181F85,29|1|0x00BBFE|90,103|-4|0x0B6BBE-050505,65|9|0x150972")
  12. if #point ~= 0 then --如果找到符合条件的点
  13. for var = 1, #point do
  14. sysLog(point[var].x..":"..point[var].y)
  15. end
  16. end
  1. point = findColors(
  2. {0, 0, 639, 959},
  3. {
  4. {x = 0, y = 0, color = 0x181F85},
  5. {x = 29, y = 1, color = 0x00BBFE, degree = 90},
  6. {x = 103, y = -4, color = 0x0B6BBE, offset = 0x050505},
  7. {x = 65, y = 9, color = 0x150972}
  8. })
  1. point = findColors(
  2. {0, 0, 639, 959},
  3. "268|802|0x181F85,297|803|0x00BBFE|90,371|798|0x0B6BBE-050505,333|811|0x150972")
  4. point = findColors(
  5. {0, 0, 639, 959},
  6. {
  7. {x = 268, y = 802, color = 0x181F85},
  8. {x = 297, y = 803, color = 0x00BBFE, degree = 90},
  9. {x = 371, y = 798, color = 0x0B6BBE, offset = 0x050505},
  10. {x = 333, y = 811, color = 0x150972}
  11. })

新旧高级多点区域找色API对比:

  1. findMultiColorInRegionFuzzyExt = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
  2. posandcolors = string.format("0|0|0x%x,%s", tcolor, posandcolors)
  3. return findColors(
  4. {x1, y1, x2, y2},
  5. posandcolors,
  6. degree,
  7. hdir or 0,
  8. vdir or 0
  9. )
  10. end
  11. findMultiColorInRegionFuzzyExt2 = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
  12. table.insert(posandcolors, 1, {x = 0, y = 0, color = tcolor})
  13. return findColors(
  14. {x1, y1, x2, y2},
  15. posandcolors,
  16. degree,
  17. hdir or 0,
  18. vdir or 0
  19. )
  20. end

注意事项:

1.高级区域多点找色函数目前最多支持返回999个。
2.支持引擎版本:1.8.30或更新

函数:findColorInRegionFuzzy 模糊区域找色(推荐使用findColor代替)

函数功能:在指定区域中,寻找符合指定颜色的坐标,模糊查找。(请使用findColor函数代替)
函数语法:
  x, y = findColorInRegionFuzzy(color, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整数型 将要找的十六进制颜色值
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1,y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
x,y 整数型 找到的点坐标,如未找到则返回 -1,-1

脚本实例:

  1. x, y = findColorInRegionFuzzy(0x112233, 100, 50, 50, 300, 300);
  2. if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点
  3. touchDown(1, x, y); --点击该点
  4. mSleep(50)
  5. touchUp(1, x, y);
  6. else --如找不到符合条件的点
  7. dialog("没找到你要的坐标呢",0);
  8. end
  1. for deg = 100, 70, -1 do --使用 for 循环不断降低精确度
  2. x, y = findColorInRegionFuzzy(0xffffff, deg, 50, 50, 300, 300);
  3. if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点
  4. touchDown(1, x, y); --点击该点
  5. mSleep(50)
  6. touchUp(1, x, y);
  7. break; --跳出循环
  8. end
  9. end
  10. dialog("噢天哪!还是没找到",0);

注意事项:

1.未找到则返回 (-1, -1) ,所以找到时 x, y 均不等于 -1,~= 为不等于操作符,是 Lua 基本语法, 属于逻辑控制。
2.该代码应用过程中,建议使用"保持屏幕"优化找色速度。

函数:findMultiColorInRegionFuzzy 区域多点找色(推荐使用findColor代替)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找。(请使用findColor函数代替)
函数语法:
  x, y = findMultiColorInRegionFuzzy(color, posandcolor, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整型 欲寻找的参照点颜色
posandcolor 文本型 周边点颜色参数
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1, y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
x, y 整数型 返回符合条件的参照点的坐标,如未找到则返回 -1,-1

脚本实例:
使用“区域模糊找色”函数时,常常会因为屏幕上有大量符合指定颜色的点而不能找到需要的坐标。该函数通过在寻找到一个符合指定颜色color的坐标后,进一步确认其周边点坐标的方式,来确定准确目标。例如,现在我们在图像上找到了我们需要的一个按钮,这个按钮的样式是不变的,但是它的整体位置却会在整个屏幕上变化,现在我们想要在脚本运行时得到其坐标。

首先确定一个参照点:
颜色为 0x181F85,坐标为 (268, 802),下表序号1。
记录下来,继续寻找周边的几个参照点,以及与第一个参照点的相对坐标,分别为下表序号2~4:

现在我们找到了需要的所有参照点:

序号 颜色 坐标 相对坐标
1 0x181F85 (268, 802) (0, 0)
2 0x00BBFE (297, 803) (29, 1)
3 0x0B6BBE (371, 798) (103, -4)
4 0x150972 (333, 811) (65, 9)

应用上述坐标写成多点找色脚本:

  1. x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE,103|-4|0x0B6BBE,65|9|0x150972", 100, 0, 0, 639, 959);

注意事项:

1.posandcolor 参数中的坐标为相对坐标。
2.颜色值的十六进制文本中,其顺序为RGB。
3.相对于第一个点的坐标,即用这个点的横坐标、纵坐标分别减去第一个点的横坐标、纵坐标,可以为负数。
4.使用此函数时精度参数设置过低,会导致性能大幅下降。

函数:findMultiColorInRegionFuzzy2 区域多点找色(推荐使用findColor代替)


函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找。(请使用findColor函数代替)
函数语法:
  x, y = findMultiColorInRegionFuzzy2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整型 欲寻找的参照点颜色
posandcolor table型 周边点颜色参数
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1, y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
x, y 整数型 返回符合条件的参照点的坐标,如未找到则返回 -1,-1

脚本实例:
该函数是区域多点找色函数findMultiColorInRegionFuzzy的增强版,将周边参照点的颜色及相对坐标写成table的形式,更方便动态调整。

  1. x, y = findMultiColorInRegionFuzzy2(0x181F85, {{x=29, y=1, color=0x00BBFE},{x=103,y=- 4,color=0x0B6BBE},{x=65,y=9,color=0x150972}}, 100, 0, 0, 639, 959)

函数:findMultiColorInRegionFuzzyExt 高级区域多点找色(推荐使用findColors代替)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找
函数语法:
  point = findMultiColorInRegionFuzzyExt(color, posandcolor, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整型 欲寻找的参照点颜色
posandcolor 文本型 周边点颜色参数
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1, y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
point table类型 以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空

返回的 table 为key-value的形式,如下:
table = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}

脚本实例:

  1. point = findMultiColorInRegionFuzzyExt(0xcf0000,"-37|3|0x942814,-38|20|0xeba62d,1|54|0xf2b054,28|22|0x8a5707", 90, 97, 220, 903, 701)
  2. if #point ~= 0 then --如果找到符合条件的点
  3. for var = 1,#point do
  4. sysLog(point[var].x..":"..point[var].y)
  5. end
  6. end

注意事项:

1.高级区域多点找色函数目前最多支持返回999个点。

函数:findMultiColorInRegionFuzzyExt2 高级区域多点找色(推荐使用findColors代替)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找
函数语法:
  point = findMultiColorInRegionFuzzyExt2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整型 欲寻找的参照点颜色
posandcolor table型 周边点颜色参数
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1, y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
point table类型 以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空

返回的 table 为为key-value的形式,如下:
table = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}

脚本实例:
该函数是高级区域多点找色函数findMultiColorInRegionFuzzyExt的增强版,将周边参照点的颜色及相对坐标写成table的形式,更方便动态调整。

  1. point = findMultiColorInRegionFuzzyExt2(0xcf0000, {{x=-37,y=3,color=0x942814},{x=-38,y=20,color=0xeba62d},{x=1,y=54,color=0xf2b054},{x=28,y=22,color=0x8a5707}}, 90, 97, 220, 903, 701)
  2. if #point ~= 0 then
  3. for var = 1,#point do
  4. sysLog(point[var].x..":"..point[var].y)
  5. end
  6. end

注意事项:

1.高级区域多点找色函数目前最多支持返回999个点。

函数:getColor 获取屏幕某点颜色值

函数功能:获取屏幕某点颜色值
函数语法:
  color = getColor(x, y)

参数说明:

参数 类型 说明
x,y 整数型 将获取颜色值的屏幕坐标
返回值 类型 说明
color 整数型 该点的十进制颜色值RGB

脚本实例:

  1. if getColor(100, 100) == 0xffffff then
  2. touchDown(1, 100, 100);
  3. touchUp(1, 100, 100);
  4. end

注意事项:

getColor函数获得的颜色值十六进制文本中,实际顺序为RGB

函数:getColorRGB 获取颜色RGB值

函数功能:获取屏幕某点颜色值R,G,B 值。
函数语法:
  color_r, color_g, color_b = getColorRGB(x, y)

参数说明:

参数 类型 说明
x,y 整数型 将获取颜色值的屏幕坐标
返回值 类型 说明
color_r, color_g, color_b 整数型 该点颜色的RGB值

脚本实例:

  1. r,g,b = getColorRGB(100,100); --获取该点的R,G,B
  2. if r > 200 and b < 150 then --判断颜色强度
  3. touchDown(1,100,100);
  4. touchUp(1,100,100);
  5. end
  1. function isColor(x,y,c,s) --x,y为坐标值,c为颜色值,s为相似度,范围0~100
  2. local fl,abs = math.floor,math.abs
  3. s = fl(0xff*(100-s)*0.01)
  4. local r,g,b = fl(c/0x10000),fl(c%0x10000/0x100),fl(c%0x100)
  5. local rr,gg,bb = getColorRGB(x,y)
  6. if abs(r-rr)<s and abs(g-gg)<s and abs(b-bb)<s then
  7. return true
  8. end
  9. return false
  10. end
  11. if isColor(963, 961, 0x7b593f,90) then touchDown(963, 961)
  12. mSleep(50)
  13. touchUp(963, 961)
  14. end

函数:findImageInRegionFuzzy 模糊区域找图

函数功能:在指定区域中,寻找指定的图案,返回其左上角顶点坐标,支持模糊查找。
函数语法:
  x, y = findImageInRegionFuzzy(picpath, degree, x1, y1, x2, y2, alpha)

参数说明:

参数 类型 说明
picpath 文本型 将要寻找的图片文件名(需要预先存放于脚本中res文件夹)
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1,y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
alpha 整数型 忽略的颜色值(透明色) 若无请填 0
返回值 类型 说明
x,y 整数型 找到的图片的左上角顶点坐标,如未找到则返回 -1,-1

脚本实例:

  1. x, y = findImageInRegionFuzzy("test_alpha.png", 100, 0, 0, 320, 480, 0xffffff);
  2. if x ~= -1 and y ~= -1 then --忽略背景色白色的情况下找到符合条件的图片则点击
  3. touchDown(1, x, y);
  4. mSleep(50)
  5. touchUp(1, x, y);
  6. else --如果没找到符合条件的
  7. dialog("没找到 ╮(╯▽╰)╭",0);
  8. end

函数:snapshot 截图

函数功能:截取屏幕中指定区域的图像并生成指定格式的图片文件
函数语法:
  snapshot(picname, x1, y1, x2, y2, quality)

参数说明:

参数 类型 说明
picname 文本型 截图保存的文件名
x1,y1 整数型 欲截取的区域左上角顶点屏幕坐标
x2,y2 整数型 欲截取的区域右下角顶点屏幕坐标
quality 数字型 当截图格式选为jpg时,可用此参数控制图片质量,此参数值为大于0且小于等于1的值

返回值:无

脚本实例:

  1. current_time = os.date("%Y-%m-%d", os.time());
  2. snapshot(current_time..".png", 0, 0, 1079, 1919); --截图并以当前时间戳命名
  3. snapshot('[public]'..i..".jpg", 0, 0, 1079, 1919, 0.9); --使用jpg格式截图,质量为0.9

注意事项:

1.保存图片的格式可为 bmp, jpg, png,推荐选择 png。
2.截图时,如使用全屏截图,右下角顶点坐标最大为当前分辨率最大值,否则会出现越界错误。
3.默认图片路径为脚本私有文件夹,文件相同将会被覆盖
4.本文实例中 os.date 与 os.time 为 Lua 基本库函数,请查阅附录 Lua 操作系统函数库。
5.".." 为字符串连接操作符,可以将字符串变量、常量连接在一起。
6.截图保存路径:
- 开发助手
Android:/data/data/com.xxscript.idehelper/tengine/public
iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp
iOS(开发助手<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp
- 叉叉助手
android: /data/data/com.xxAssistant/tengine/public
iOS(叉叉版本>=2.5.0):/var/mobile/Library/XXAssistant/Lua/Luas/Temp
iOS(叉叉版本<2.5.0):/Library/Application Support/XXAssistant/Lua/Luas/Temp
- IPA精灵
IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/
7.公共目录路径:
- 开发助手
Android:/data/data/com.xxscript.idehelper/tengine/public
iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp/public
iOS(开发助手版本<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp/public
- 叉叉助手
Android: /sdcard/com.xxAssistant/tengine/public
iOS(叉叉版本>=2.5.0): /var/mobile/Library/XXAssistant/Lua/Luas/Temp/public
iOS(叉叉版本<2.5.0): /Library/ApplicationSupport/XXAssistant/Lua/Luas/Temp/public
- IPA精灵
IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/public
8.引擎1.3.0版本增加对公共目录[public]访问支持,截图方向跟随init

函数:keepScreen 保持屏幕

函数功能:函数功能:在脚本中保持当前屏幕内容不变,多次调用取色、找色、截图、找图等函数时,直接调用保持的屏幕内容。该函数主要用于优化找图找色函数的效率。
函数语法:
  keepScreen(flag)

参数说明:

参数 类型 说明
flag 逻辑型 保持开关

返回值:无

脚本实例:

  1. keepScreen(true);
  2. for k = 1, 640, 10 do
  3. for j = 1, 960, 10 do
  4. --格式化颜色为十六进制文本
  5. color = string.format("%X", getColor(k, j));
  6. --输出系统日志
  7. sysLog("("..k..", "..j..") Color: "..color..".");
  8. end
  9. end
  10. keepScreen(false);

函数:inputText 输入字符串

函数功能:向输入框中输入文本
函数语法:
  inputText(string)

参数说明:

参数 类型 说明
string 文本型 将输入的文本以及控制字符

返回值:无

脚本实例:

  1. touchDown(1,150,150); --点击输入框获取焦点(假设已知输入框坐标150,150
  2. mSleep(50)
  3. touchUp(1,150,150);
  4. mSleep(1000);
  5. inputText("#CLEAR#") --删除输入框中的文字(假设输入框中已存在文字)
  6. mSleep(1000);
  7. inputText("Welcome.#ENTER#"); --在输入框中输入字符串"Welcome."并回车

注意事项:

1.使用该函数前,必须先点击输入框获取焦点(指使当前的输入光标停留在某一输入框中)。
2.iOS系统上,该函数不支持第三方输入法(指百度输入法、搜狗输入法等),请切换到系统内置输入法方可使用,对于弹出的窗口,需要先初始化再使用该函数,例如 App Store登录窗口(该窗口识别ID 为"com.apple.springboard"),安卓则无此限制。
3.可使用控制字符,包括 \n、\r、#ENTER#、#CLEAR#;#CLEAR#表示清空,需要注意的是,#ENTER#并非支持在所有应用中使用。

函数:createOcrDict 加载自定义的点阵字库

函数功能:加载自定义的点阵字库
函数语法:
  index = createOcrDict(dict)

参数说明:

参数 类型 说明
dict 文本型/table型 字库名,如:dict.txt,需放置于脚本内 res 目录;或table型字库编码
返回值 类型 说明
index 整数型 字库标识,由 createOcrDict 函数返回值生成,ocrText第一个参数需要用到此值

脚本实例:

  1. lines = {}
  2. lines[1] = 'FFFFFC000000000000000000000001FFF$u$0.0.56$15'
  3. lines[2] = 'FFFFFC$l$0.0.42$21'
  4. lines[3] = '10EE1B06608811062084108218C1FF8FF$a$0.1.77$15'
  5. lines[4] = 'FFFFFC03008030040080100200600F00F$h$0.0.71$21'
  6. lines[5] = '0040080100200400801002FFFFFC010020040080100200400800400$王$4.2.83$21'
  7. lines[6] = '1FE200400801002007F8000000000080601804030300E002002001001001001001$哈$0.1.118$26'
  8. local dict = createOcrDict(lines)
  9. --或者可以写成这样的形式 local dict = createOcrDict("dict.txt")
  10. result = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020","0x797979-0x202020"}, 100, 0, 0) -- 表示范围内全部搜索,以字符串形式返回识别结果
  11. sysLog('result: ' .. result)
  12. results = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020"}, 100, 1, 1) -- 表示范围内横向搜索,以table形式返回识别到的所有结果及其坐标
  13. for k,v in pairs(results) do
  14. sysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))
  15. end

注意事项:

1.ocr函数不支持多分辨率,不受setScreenScale影响
2.字库文件“dict.txt”需注意文本编码必须使用 UTF-8 格式,并放置于脚本内 res 目录
3.搜索方向横向或竖向时的检索规则为:从识别到第一个匹配结果开始给予该位置横向或竖向搜索,忽略选定区域内其他范围;合理使用搜索方向参数可有效提高ocr函数性能。

函数:ocrText 文字点阵化识别

函数功能:识别屏幕上的文字。
函数语法:
  result = ocrText(index, x1, y1, x2, y2, {"c0-c1"} , sim, flag, dir)

参数说明:

参数 类型 说明
index 整数型 字库标识,由 createOcrDict 函数返回值生成
x1, y1 整数型 识别区域左上角顶点屏幕坐标
x2, y2 整数型 识别区域右下角顶点屏幕坐标
c0, c1 文本型 偏色范围,由字库制作中获取,需要与制作字库时所设值保持一致,多组偏色用,分割
sim 整数型 精确度,范围 0 - 100
flag 整数型 表示选择返回结果的类型, 0 == 字符串形式返回识别结果,1 == table形式返回识别到的结果及其坐标
dir 整数型 选填项,表示识别方向,0 == 区域内全部搜索,1 == 横向搜索, 2 ==竖向搜索, 忽略此项则默认为0
返回值 类型 说明
result 文本型/table型 返回识别结果/返回识别到的结果及其坐标

脚本实例:

  1. lines = {}
  2. lines[1] = 'FFFFFC000000000000000000000001FFF$u$0.0.56$15'
  3. lines[2] = 'FFFFFC$l$0.0.42$21'
  4. lines[3] = '10EE1B06608811062084108218C1FF8FF$a$0.1.77$15'
  5. lines[4] = 'FFFFFC03008030040080100200600F00F$h$0.0.71$21'
  6. lines[5] = '0040080100200400801002FFFFFC010020040080100200400800400$王$4.2.83$21'
  7. lines[6] = '1FE200400801002007F8000000000080601804030300E002002001001001001001$哈$0.1.118$26'
  8. local dict = createOcrDict(lines)
  9. --或者可以写成这样的形式 local dict = createOcrDict("dict.txt")
  10. result = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020","0x797979-0x202020"}, 100, 0, 0) -- 表示范围内全部搜索,以字符串形式返回识别结果
  11. sysLog('result: ' .. result)
  12. results = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020"}, 100, 1, 1) -- 表示范围内横向搜索,以table形式返回识别到的所有结果及其坐标
  13. for k,v in pairs(results) do
  14. sysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))
  15. end

注意事项:

1.ocr函数不支持多分辨率,不受setScreenScale影响
2.字库文件“dict.txt”需注意文本编码必须使用 UTF-8 格式,并放置于脚本内 res 目录
3.搜索方向横向或竖向时的检索规则为:从识别到第一个匹配结果开始给予该位置横向或竖向搜索,忽略选定区域内其他范围;合理使用搜索方向参数可有效提高ocr函数性能。

函数:createOCR 载入高级文字识别字库(集成tesserOCR)

函数功能:载入高级文字识别字库,并指定检测方式
函数语法:
  ocr, msg = createOCR({
  type = "tesseract",
  mode = mode,
  path = path,
  lang = lang
  })

参数说明:

参数 类型 说明
type 文本型 [必填]文字识别类型,暂只支持tesseract,更多ocr引擎逐步支持中
mode 整数型 [选填]引擎识别模式(参见下表),默认3
path 文本型 [选填]字库路径,不填默认使用eng字库路径;官方字库扩展路径、自定义路径见下方说明
lang 文本型 [选填]字库语言文件名称,不填则默认eng(只支持一般的中英+数字+标点符号)

path 自定义字库,有两种路径选择:
对于自定义字库,有以下几种路径选择:
1. 内置到xsp的res目录下,直接指定res路径:"res/"
2. 下载到public目录下,指定[public]和子路径:"[public]downloads/tessdata/"
3. 使用开发助手/叉叉助手的字库扩展,指定[external]即可:"[external]"
特别注意:下载到public目录的字库路径,traineddata的上层目录必须命名为tessdata

lang 字库语言文件:
1. lang 为.traineddata字库文件名,叉叉助手、开发助手中可下载的字库语言文件有:
chi_sim 简体中文字库
chi_tra 繁体中文字库
eng_ext 英文增强版字库
eng 内置默认精简版中英数字标点字库,免下载可用
2. 识别要求不高或识别数据比较标准,也可以path和lang都不填,使用默认字库eng,只支持一般的中英+数字+标点符号。

字库与语言配置样例:
1. path & lang均不填: 使用内置eng字库
2. path = [external] & lang = eng_ext/chi_sim/chi_tra:叉叉提供的字库扩展(需下载)
3. path = "res/" & lang = dictname(dictname:xsp打包中res目录字库文件名)

引擎识别模式 说明
0 仅执行Tesseract,速度最快
1 仅进行Cube处理,较慢但准确
2 结合Tesseract和Cube处理,最准确
3 根据字库配置自动选择
返回值 类型 说明
ocr 文本型 ocr实例,创建失败时ocr为nil
msg 文本型 创建成功返回版本号,创建失败返回错误信息

脚本实例:

  1. local ocr, msg = createOCR({
  2. type = "tesseract", -- 指定tesseract引擎
  3. path = "[external]", -- 使用开发助手/叉叉助手的扩展字库
  4. lang = "eng_ext" -- 使用英文增强字库(注意需要提前下载好)
  5. })
  6. if ocr ~= nil then
  7. -- ocr 创建成功,使用该实例进行后续识别操作(参见下面函数文档)
  8. sysLog("createOCR succeed: Tesseract-OCR v" .. msg)
  9. else
  10. -- ocr 创建失败,根据msg提示调整
  11. sysLog("createOCR failed: " .. tostring(msg))
  12. end

训练字库:
请参阅:【如何使用Tesseract-OCR(v3.02.02)训练字库】

注意事项:

支持引擎版本:1.8.10或更新
引擎内置Tesseract-OCR版本:3.02.02

函数:ocr:getText 高级文字识别

函数功能:使用已载入的高级文字识别字库进行识别
函数语法:
  local code, text = ocr:getText({
  psm = psm,
  rect = {x1, y1, x2, y2},
  diff = {diff},
  data = data,
  whitelist = whitelist,
  blacklist = blacklist
  })

参数说明:

参数 类型 说明
psm 整数型 [选填]int: page segmentation mode(参见下表),默认6
rect table [必填]{x1, y1, x2, y2} 屏幕的识别范围,越准确越好
diff table [必填]{"颜色1-误差1", "颜色2-误差2", ...} 色值范围,可以提供多个,供二值化使用
data table [选填]二值化二维数组,1代表有效数据,其余代表无效数据)
whitelist 文本型 [选填]仅识别为白名单中的字符
blacklist 文本型 [选填]识别时需排除的字符(对识别时易相互混淆的字符进行排除)
psm选项 说明
0 仅检测方向和文本
1 自动检测方向和文本(OSD)
2 自动检测,但不进行OSD或OCR处理
3 自动PSM模式(但不含OSD)
4 所识别图片的字体大小不一
5 所识别图片当作整块竖向文字区域
6 所识别图片当作整块横向文字区域 (默认值)
7 所识别图片当作一行文字
8 所识别图片当作单个词语
9 所识别图片当作单个圆型围绕的词语
10 所识别图片当作单个英文/数字字符
11 尽可能识别更多的字符(无顺序要求)
12 分散稀疏的OSD检测
返回值 类型 说明
code 整数型 code = 0: 识别成功;code < 0: 识别失败
text 文本型 识别出的字符串(末尾可能有多余的换行或空格),识别失败时,text为对应的错误提示

脚本实例:

  1. local ocr, msg = createOCR({
  2. type = "tesseract", -- 指定tesseract引擎
  3. path = "[external]", -- 使用开发助手/叉叉助手的扩展字库
  4. lang = "eng_ext" -- 使用英文增强字库(注意需要提前下载好)
  5. })
  6. if ocr ~= nil then
  7. string.trim = function(s)
  8. return s:match'^%s*(.*%S)' or ''
  9. end
  10. local code, text = 0, ""
  11. mSleep(1000)
  12. -- 识别屏幕图像内容(例如5/5s设备的当前时间显示)
  13. code, text = ocr:getText({
  14. rect = {249, 6, 249 + 144, 6 + 29},
  15. diff = {"0x000000-0x101010"}, -- 时间颜色为纯黑
  16. whitelist = "0123456789APM:" -- 添加所有可能出现的字符作为白名单
  17. })
  18. -- 输出示例:"code = 0, text = 5:24 PM" (末尾可能有多余换行符,为正常结果,可以参考trim处理)
  19. sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())
  20. mSleep(1000)
  21. -- 识别二值化二维数组(单个字符)
  22. code, text = ocr:getText({
  23. psm = 10, -- 所识别图片当作单个英文/数字字符
  24. data = {
  25. {0,0,0,0,1,0,0,0,0,0,0,0,0,0},
  26. {0,0,0,1,0,1,0,0,0,0,0,0,0,0},
  27. {0,0,0,0,1,0,0,0,0,0,0,0,0,0},
  28. {0,0,0,1,0,0,0,0,0,0,0,0,0,0},
  29. {0,0,0,1,0,0,0,0,0,0,0,0,0,0},
  30. {0,0,1,1,0,0,0,0,0,0,0,0,0,0},
  31. {0,1,0,1,0,0,0,0,0,0,0,0,0,0},
  32. {0,1,1,1,1,1,0,1,1,0,0,0,0,0},
  33. {1,0,1,1,0,0,0,0,1,1,1,0,0,0},
  34. {0,1,0,1,0,0,0,0,0,0,1,1,0,0},
  35. {1,1,1,0,0,0,0,0,0,0,1,1,0,0},
  36. {1,0,0,0,0,0,0,0,0,0,1,0,1,0},
  37. {1,0,0,0,0,0,0,0,0,0,0,1,1,0},
  38. {1,0,0,0,0,0,0,0,0,0,0,1,0,1},
  39. {1,0,0,0,0,0,0,0,0,0,0,0,1,0},
  40. {1,0,0,0,0,0,0,0,0,0,0,1,1,1},
  41. {1,0,0,0,0,0,0,0,0,0,0,1,0,1},
  42. {1,1,0,0,0,0,0,0,0,0,0,1,1,0},
  43. {1,0,1,0,0,0,0,0,0,0,1,0,0,0},
  44. {0,1,1,1,0,1,0,0,1,1,1,0,0,0},
  45. {0,0,0,1,1,1,0,1,1,0,0,0,0,0},
  46. {0,0,0,0,0,0,1,0,1,0,0,0,0,0}
  47. },
  48. whitelist = "0123456789" -- 添加白名单为数字类型
  49. })
  50. -- 输出示例:"code = 0, text = 6"
  51. sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())
  52. mSleep(1000)
  53. -- 识别二值化二维数组(多个字符)
  54. code, text = ocr:getText({
  55. psm = 7, -- 所识别图片当作一行文字
  56. data = {
  57. {1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0},
  58. {1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0},
  59. {1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},
  60. {1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},
  61. {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  62. {1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0},
  63. {1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0},
  64. {1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0},
  65. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1},
  66. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
  67. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
  68. {0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1},
  69. {1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1},
  70. {0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0},
  71. {0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0}
  72. },
  73. whitelist = "0123456789"
  74. })
  75. -- 输出示例:"code = 0, text = 53"
  76. sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())
  77. else
  78. sysLog("createOCR failed: " .. tostring(msg))
  79. end

特别说明

diff = {"C1-D1", "C2-D2", …} 设置的意义是,当区域内任意一个颜色值Cxy,满足条件 min(Ci - Di, 0x000000) ≤ Cxy ≤ max(Ci + Di, 0xffffff),i = 1, 2, … 的时候,这个位置的颜色就是有效颜色(0xffffff),否则,都是无效颜色(0x000000)。这个处理过程称为二值化,经过这样处理后的二值化数据,提交给OCR识别会更加精确。

注意事项:

支持引擎版本:1.8.10或更新

函数:ocr:release 释放字库

函数功能:主动释放OCR字库,避免内存峰值过高导致被系统强杀
函数语法:
  ocr:release()

参数说明:
使用到字库较大的情况下,为避免内存峰值过高导致被系统强杀,请在OCR使用完毕时调用API释放ocr,否则只能依赖lua的gc自动清理。

脚本实例:

  1. local ocr, msg = createOCR({
  2. type = "tesseract", -- 指定tesseract引擎
  3. path = "[external]", -- 使用开发助手/叉叉助手的扩展字库
  4. lang = "eng_ext" -- 使用英文增强字库(注意需要提前下载好)
  5. })
  6. local code, text = ocr:getText({
  7. rect = {249, 6, 249 + 144, 6 + 29},
  8. diff = {"0x000000-0x101010"},
  9. whitelist = "0123456789APM:"
  10. })
  11. -- ocr使用完毕,为避免内存峰值过高导致被系统强杀(主要是使用到字库较大的情况下)
  12. -- 建议及时手动释放ocr
  13. ocr:release()

注意事项:

支持引擎版本:1.8.11或更新

函数:binarizeImage 二值化图片转换为table

函数功能:对当前屏幕指定范围的图像二值化,并转换为table,得到的结果通过去噪或者矩阵运算后,可以提供给ocr:getText()识别成文字
函数语法:
  colorTbl = binarizeImage({
   rect = {x1, y1, x2, y2},
   diff = {diff}
  })

参数说明:

参数 类型 说明
rect table [必填]{x1, y1, x2, y2} 屏幕二值化的识别范围,越准确越好
diff table [必填]{"颜色1-误差1", "颜色2-误差2", ...} 色值范围,可以提供多个,供二值化使用
返回值 类型 说明
colorTbl 文本型 图像二值化后的table

脚本实例:

  1. colorTbl = binarizeImage({
  2. rect = {30, 80, 53, 101},
  3. diff = {"0xf7d363-0x1f1f1f", "0xefaa29-0x1f1f1f"}
  4. })
  5. -- 输出colorTbl每一行测试转换结果
  6. for _, row in pairs(colorTbl) do
  7. sysLog(table.concat(row, ','))
  8. end
  9. --[[
  10. colorTbl格式类似这样:
  11. {
  12. {0,0,0,0,1,0,0,0,0,0,0,0,0,0},
  13. {0,0,0,1,0,1,0,0,0,0,0,0,0,0},
  14. {0,0,0,0,1,0,0,0,0,0,0,0,0,0},
  15. {0,0,0,1,0,0,0,0,0,0,0,0,0,0},
  16. {0,0,0,1,0,0,0,0,0,0,0,0,0,0},
  17. {0,0,1,1,0,0,0,0,0,0,0,0,0,0},
  18. {0,1,0,1,0,0,0,0,0,0,0,0,0,0},
  19. {0,1,1,1,1,1,0,1,1,0,0,0,0,0},
  20. {1,0,1,1,0,0,0,0,1,1,1,0,0,0},
  21. {0,1,0,1,0,0,0,0,0,0,1,1,0,0},
  22. {1,1,1,0,0,0,0,0,0,0,1,1,0,0},
  23. {1,0,0,0,0,0,0,0,0,0,1,0,1,0},
  24. {1,0,0,0,0,0,0,0,0,0,0,1,1,0},
  25. {1,0,0,0,0,0,0,0,0,0,0,1,0,1},
  26. {1,0,0,0,0,0,0,0,0,0,0,0,1,0},
  27. {1,0,0,0,0,0,0,0,0,0,0,1,1,1},
  28. {1,0,0,0,0,0,0,0,0,0,0,1,0,1},
  29. {1,1,0,0,0,0,0,0,0,0,0,1,1,0},
  30. {1,0,1,0,0,0,0,0,0,0,1,0,0,0},
  31. {0,1,1,1,0,1,0,0,1,1,1,0,0,0},
  32. {0,0,0,1,1,1,0,1,1,0,0,0,0,0},
  33. {0,0,0,0,0,0,1,0,1,0,0,0,0,0}
  34. }
  35. ]]--
  36. -- colorTbl结果进行可选的去噪或者矩阵运算纠正等处理
  37. -- (假设处理函数是denoising)
  38. colorTbl = denoising(colorTbl)
  39. local ocr, msg = createOCR({
  40. type = "tesseract"
  41. })
  42. -- 使用ocr识别新的colorTbl
  43. local code, text = ocr:getText({
  44. data = colorTbl,
  45. psm = 10 -- 单个字符模式识别
  46. })
  47. sysLog("code = " .. tostring(code) .. ", text = " .. text)
  48. -- 输出结果:code = 0, text = 6

注意事项:

支持引擎版本:1.8.30或更新

函数:runApp 运行应用

函数功能:打开一个应用程序。
函数语法:
  flag = runApp(appid)

参数说明:

参数 类型 说明
appid 文本型 应用程序的应用ID
返回值 类型 说明
flag 整数型 0 == 应用启动成功;非0 == 应用启动失败

脚本实例:

  1. r = runApp("com.apple.Music");
  2. mSleep(10 * 1000); --等待程序响应
  3. if r == 0 then
  4. closeApp("com.apple.Music");
  5. else
  6. toast("启动应用失败",3);
  7. end

注意事项:

1.runApp函数需要系统响应时间,响应时间根据机型有所不同,调用此函数需做好延迟或判断。

函数:closeApp 关闭应用

函数功能:关闭一个应用程序。
函数语法:
  closeApp(appid)

参数说明:

参数 类型 说明
appid 文本型 应用程序的应用ID

返回值:无

脚本实例:

  1. r = runApp("com.apple.Music");
  2. mSleep(10 * 1000); --等待程序响应
  3. if r == 0 then
  4. closeApp("com.apple.Music");
  5. else
  6. toast("启动应用失败",3);
  7. end

函数:appIsRunning 检测应用是否运行

函数功能:检测应用是否运行
函数语法:
  flag = appIsRunning(appid)

参数说明:

参数 类型 说明
appid 文本型 目标应用程序的应用ID
返回值 类型 说明
flag 整数型 0 - 目标应用未运行;1 - 目标应用运行中

脚本实例:

  1. flag = appIsRunning("com.xxAssistant"); --检测叉叉助手是否在运行
  2. if flag == 0 then
  3. runApp("com.xxAssistant") --运行叉叉助手
  4. end

注意事项:

此函数将判断目标应用的运行状态,目标应用前台运行或者后台运行返回值都为 1。

函数:isFrontApp 判断是否为前台应用

函数功能:根据应用ID判断应用是否处于前台。
函数语法:
  flag = isFrontApp(appid)

参数说明:

参数 类型 说明
appid 文本型 待检测的应用程序的应用ID
返回值 类型 说明
flag 整数型 0 == 不在前台运行;1 == 在前台运行

脚本实例:

  1. while true do
  2. isfront = isFrontApp("com.xxAssistant"); --前台状态
  3. if isfront == 1 then
  4. break
  5. end
  6. toast("请打开叉叉助手");
  7. mSleep(3000)
  8. end

函数:frontAppName 获取前台应用识别ID

函数功能:获取前台应用程序的应用ID。
函数语法:
  appid = frontAppName()

参数说明:

返回值 类型 说明
appid 文本型 返回前台应用程序的应用ID,若无应用处于前台,则返回空字符串

脚本实例:

  1. appid = frontAppName();
  2. if appid ~= "com.apple.mobilesafari" then
  3. dialog("请打开 Safari 再运行该脚本!", 5);
  4. mSleep(3000);
  5. lua_exit();
  6. end

函数:showUI 自定义脚本界面

函数功能:显示一个自定义的界面,用来接收用户相关的自定义配置。
函数语法:
  ret,results = showUI(ui_json)

参数说明:

参数 类型 说明
ui_json 文本型 自定义界面json格式字符串,或UI目录下的json文件名称
返回值 类型 说明
ret 整数型 返回用户按下的按钮 0 - 取消;1 - 确定
results table类型 返回用户输入的多项数据

脚本界面说明

脚本界面通过json格式存储 ,以下是一个包含所有控件及其属性的例子:

  1. {
  2. "style" : "default",
  3. "config" : "save_111.dat",
  4. "width" : 700,
  5. "height" : 1080,
  6. "cancelname" : "Cancel",
  7. "okname" : "Let's Rock",
  8. "cancelscroll" : true,
  9. "countdown":10,
  10. "views" : [
  11. {
  12. "text" : "基本设置",
  13. "type" : "Page",
  14. "views" : [
  15. {
  16. "align" : "center",
  17. "color" : "0,0,225",
  18. "size" : 30,
  19. "bg" : "0,0,0", //RGB格式规定标签的背景色,不指定为透明
  20. "text" : "设置:这是一行文本",
  21. "type" : "Label"
  22. },
  23. {
  24. "id" : "RadioGroup1",
  25. "list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7",
  26. "select" : "0",
  27. "size" : 30,
  28. "type" : "RadioGroup",
  29. "orientation" : "vertical" //选项排布方式为竖排
  30. },
  31. {
  32. "align" : "left",
  33. "color" : "0,100,0",
  34. "id" : "Edit1",
  35. "kbtype" : "number",
  36. "prompt" : "这是提示文本",
  37. "size" : 25,
  38. "text" : "这是预输入文本",
  39. "type" : "Edit"
  40. },
  41. {
  42. "id" : "CheckBoxGroup1",
  43. "list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7",
  44. "select" : "3@5",
  45. "size" : 30,
  46. "type" : "CheckBoxGroup",
  47. "orientation" : "horizontal" //选项排布方式为智能横排
  48. },
  49. {
  50. "id" : "ComboBox1",
  51. "list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7",
  52. "select" : "1",
  53. "size" : 30,
  54. "type" : "ComboBox"
  55. },
  56. {
  57. "src" : "b.png", //这是来源为本地文件的图片
  58. "type" : "Image"
  59. },
  60. {
  61. "src" : "http://www.baidu.com/img/bdlogo.png", //这是来源为网络地址的图片
  62. "type" : "Image"
  63. }
  64. ]
  65. },
  66. {
  67. "text" : "水平布局",
  68. "type" : "Page",
  69. "views" : [
  70. {
  71. "color" : "100,100,100",
  72. "size" : 30,
  73. "text" : "以下是水平布局排列的三个控件",
  74. "type" : "Label"
  75. },
  76. {
  77. "height" : 300,
  78. "width" : 700,
  79. "id" : "group1",
  80. "type" : "LinearLayout", //这是LinearLayout控件
  81. "valign" : "top",
  82. "views" : [
  83. //从这里开始是LinearLayout控件内部的子控件,不可嵌套LinearLayout控件,可添加LinearLayout、Page以外的所有控件
  84. {
  85. "color" : "100,100,100",
  86. "size" : 30,
  87. "text" : "选择",
  88. "type" : "Label",
  89. "width" : 100
  90. //LinearLayout控件内部的子控件均需要指定一个width属性,不指定则无法显示
  91. },
  92. {
  93. "id" : "checkboxgroup2",
  94. "list" : "选项1,选项2,选项3",
  95. "select" : "2@3@",
  96. "type" : "CheckBoxGroup",
  97. "width" : 180
  98. },
  99. {
  100. "id" : "4",
  101. "list" : "选项1,选项2,选项3,选项4,选项5",
  102. "select" : "1",
  103. "size" : 20,
  104. "type" : "ComboBox",
  105. "width" : 250
  106. }
  107. ]
  108. },
  109. {
  110. "color" : "100,100,100",
  111. "size" : 30,
  112. "text" : "以下是一张默认布局方式的图片,水平布局可与普通布局样式联合使用",
  113. //这里是一个Label,跟上面的LinearLayout同层级
  114. "type" : "Label",
  115. "width" : 100
  116. },
  117. {
  118. "src" : "b.png",
  119. "type" : "Image"
  120. },
  121. {
  122. "color" : "100,100,100",
  123. "size" : 30,
  124. "text" : "以下又是一个水平布局区域",
  125. //这里也是一个Label,跟上面的LinearLayout同层级
  126. "type" : "Label"
  127. },
  128. {
  129. //在同层级的情况下,可以多个LinearLayout联合使用,以下是第二个LinearLayout控件中的内容
  130. "height" : 400,
  131. "width" : 700,
  132. "id" : "group1",
  133. "type" : "LinearLayout",
  134. "valign" : "top",
  135. "views" : [
  136. {
  137. "color" : "100,100,100",
  138. "size" : 30,
  139. "text" : "右边是一张图片",
  140. "type" : "Label",
  141. "width" : 150
  142. },
  143. {
  144. "src" : "b.png",
  145. "type" : "Image",
  146. "width" : "400"
  147. }
  148. ]
  149. }
  150. ]
  151. },
  152. {
  153. "text" : "跳转示例",
  154. "type" : "Page",
  155. "views" : [
  156. {
  157. "color" : "100,110,200",
  158. "extra" : [ //附加属性指定
  159. {
  160. "goto" : "http://www.baidu.com", //跳转到网址
  161. "text" : "阅读原文"
  162. },
  163. {
  164. "goto" : "qq", //跳转到QQ咨询
  165. "text" : "1602127440"
  166. }
  167. ],
  168. "size" : 30,
  169. "text" : "阅读原文 QQ:1602127440",
  170. "type" : "Label"
  171. }
  172. ]
  173. },
  174. {
  175. "text" : "V1.6.7更新",
  176. "type" : "Page",
  177. "views" : [
  178. {
  179. "align" : "left",
  180. "color" : "0,0,0",
  181. "size" : 40,
  182. "text" : "标签",
  183. "type" : "Label",
  184. "bg" : "100,100,100"
  185. },
  186. {
  187. "id" : "web",
  188. "url" : "http://www.baidu.com",
  189. "type" : "WebView",
  190. "height" : 500,
  191. "width" : 800
  192. },
  193. {
  194. "id" : "line",
  195. "type" : "Line",
  196. "color" : "0,0,255",
  197. "height" : 7,
  198. "width" : 800
  199. }
  200. ]
  201. }
  202. ]
  203. }

创建一个界面,需要包含style和views两个参数。

界面控件:
界面包含有8种控件:标签 Label,单选框 RadioGroup,编辑框 Edit,多选框CheckBoxGroup,下拉框 ComboBox,图片 Image,页面Page,水平布局LinearLayout。
例如一个标签控件的例子:

  1. {
  2. "type": "Label",
  3. "text": "设置",
  4. "size": 25,
  5. "align": "center",
  6. "color": "0,0,255"
  7. }

以上九种控件均可重复使用,这个界面的样式 style 为 default,即默认样式,这个样式下的控件将会自动排列,不需要指定其坐标。部分控件带有id参数,id不可重复,需要注意的是,涉及到用户操作的控件,其id参数为必填项。

  1. {
  2. "id" : "group1",
  3. "width" : 1780,
  4. "height" : 600,
  5. "type" : "LinearLayout",
  6. "views" : [
  7. {
  8. "color" : "100,110,200",
  9. "size" : 30,
  10. "text" : "标题栏",
  11. "type" : "Label",
  12. "width" : 100
  13. },
  14. {
  15. "id" : "checkboxgroup2",
  16. "list" : "选项1,选项2,选项3",
  17. "select" : "2@3@",
  18. "type" : "CheckBoxGroup",
  19. "width" : 250
  20. },
  21. {
  22. "id" : "4",
  23. "list" : "选项1,选项2,选项3,选项4,选项5",
  24. "select" : "1",
  25. "size" : 20,
  26. "type" : "ComboBox",
  27. "width" : 210
  28. }
  29. ]
  30. }

另一种界面style样式为 custom,当界面样式被指定为这种,则必须指定每个控件的 rect 属性以调整控件的尺寸以及位置,例如:

  1. {
  2. "type": "Edit", "size": 15, "align": "left",
  3. "prompt": "提示文字",
  4. "text": "默认文字",
  5. "color": "255,0,0",
  6. "rect": "0,0,100,40"
  7. }

函数:getUIContent 获取UI文件信息

函数功能:获取json文件中的内容
函数语法:
  content = getUIContent(string)

参数说明:

参数、返回值 类型 说明
string 文本型 脚本UI目录下json文件名称
content 文本型 所获取的json文件内容

脚本实例:

  1. --ui.json文件内具体内容如下
  2. {
  3. "style": "default",
  4. "config": "save.dat",
  5. "width": 400,
  6. "height": 300,
  7. "cancelname": "Quit",
  8. "okname": "Let's Rock!",
  9. "views": [
  10. {
  11. "type": "Page",
  12. "text": "settings",
  13. "views": [
  14. {
  15. "type": "Label",
  16. "text": "Settings",
  17. "size": 25,
  18. "align": "center",
  19. "color": "0,0,255",
  20. }
  21. ]
  22. }
  23. ]
  24. }
  1. --lua文件中示例如下
  2. local bb = require("badboy")
  3. local json = bb.json
  4. ret,results=showUI("ui.json"); --显示未更改的UI界面
  5. content = getUIContent("ui.json") --获得文件ui.json的内容
  6. lua_value = json.decode(content) --对获取到的json字符串解码
  7. lua_value.width = 500 --将ui窗口宽度赋值为500
  8. lua_value.height = 400 --将ui窗口宽度赋值为450
  9. showUI(json.encode(lua_value)) --重新编码json字符串,窗口将按照新设定的尺寸显示

注意事项:

1.badboy是专为叉叉脚本开发的开源工具库,具体使用方法参照对应章节

函数:resetUIConfig 重置UI默认选项

函数功能:重置UI默认选项
函数语法:
  resetUIConfig(file)

参数说明:

参数 类型 说明
file 文本型 需要重置的UI配置文件,例"save.dat"

返回值:无

脚本实例:

  1. ret,results = showUI("ui.json")
  2. mSleep(500)
  3. resetUIConfig("save_111.dat")
  4. mSleep(500)
  5. toast("UI默认选项已重置")
  6. mSleep(2500)
  7. ret,results = showUI("ui.json")

注意事项:

支持引擎版本:1.7.4或更新

函数:getScreenSize 获取屏幕分辨率

函数功能:获取设备屏幕的分辨率,用来判断坐标系的使用。
函数语法:
  width,height = getScreenSize()

参数说明:

返回值 类型 说明
width 整数型 获取到的屏幕宽度
height 整数型 获取到的屏幕高度

注意事项:

统一为竖直(Home 键在下方时)屏幕的宽度和高度。

函数:setScreenScale 设置屏幕缩放

函数功能:设置当前脚本开发环境的屏幕分辩率,使脚本适配不同分辩率的设备。
函数语法:
  setScreenScale(width, height, scale)

参数说明:

参数 类型 说明
width 整数型 脚本开发时使用的设备宽度
height 整数型 脚本开发时使用的设备高度
scale 整数型 返回坐标缩放参数, 默认为0; 0 - 返回的坐标进行反向缩放,1 - 返回的坐标不缩放

  该函数使脚本根据开发环境的屏幕分辩率和当前使用环境分辨率自动将脚本里XY坐标进行等比换算
  受影响命令包括:touchDown、touchUp、touchMove、findColorInRegionFuzzy、findMultiColorInRegionFuzzy、findMultiColorInRegionFuzzy2 、findMultiColorInRegionFuzzyExt、findMultiColorInRegionFuzzyExt2、getColor、getColorRGB、showHUD

脚本实例:
假设一名作者在540*960分辨率的手机中开发了脚本,要在720*1280的设备中运行

  1. setScreenScale(540,960) --或者setScreenScale(540,960,0)效果相同
  2. touchDown(0, 100, 200) --此处实际点击坐标为:100*(720/540),200*(1280/960)
  3. mSleep(50)
  4. touchMove(0, 100, 200) --此处实际移动坐标为:100*(720/540),200*(1280/960)
  5. mSleep(50)
  6. touchUp(0, 100, 200)
  7. x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE", 100, 0, 0, 400, 600)
  8. --此处实际查找范围为坐标(0,0)到(400*720/540,600*1280/960),同时坐标偏移也进行换算,即匹配首点x,y坐标后,再比对(x+29*720/540,y+1*1280/960)这个坐标是否为"0x00BBFE"
  9. if x~=-1 then
  10. touchDown(0, x, y) --第三参数为0或省略情况下返回的坐标为经过反向缩放的坐标,
  11. mSleep(100)
  12. touchUp(0, x, y)
  13. end

注意事项:

1.通分辨率取色要点:取色点周边颜色相近为佳,由于字体或图形边缘线的点就很可能由于缩放而消失,导致找色失败。
2.只适用等比例分辨率:例如540*960,720*1280都是9:16就可通用,而540*960与400*800的一般不通用。
3.在最小分辨率开发,同比例的大分辨可用。例如:540*960下开发的脚本,在720*1280可用,反过来,一般不能通用。

函数:mTime 获取Unix时间戳

函数功能:显示从1970年到现在经过的毫秒数
函数语法:
  t = mTime()

参数说明:

返回值 类型 说明
t 整数型 表示从1970年到现在经过的毫秒数

脚本实例:

  1. sysLog('mTime:' .. mTime())

函数:getNetTime 获取网络时间

函数功能:获取GMT时区从1970年到现在经过的秒数
函数语法:
  t = getNetTime()

参数说明:

返回值 类型 说明
t 整数型 表示网络时间GMT时区从1970年到现在经过的秒数,无网络情况下返回值为0

脚本实例:

  1. sysLog("NetTime:" .. getNetTime())

函数:pressHomeKey 模拟主屏幕按键

函数功能:模拟用户点击主屏幕按键的操作。
函数语法:
  pressHomeKey()

参数说明:
返回值:无

函数:doublePressHomeKey 双击HOME键

函数功能:模拟用户双击HOME键的操作,用于打开后台。
函数语法:
  doublePressHomeKey()

参数说明:
返回值:无

脚本实例:

  1. doublePressHomeKey();

函数:pressKey 导航栏按键

函数功能:模拟用户点击导航栏按键的操作,仅安卓适用
函数语法:
  ret = pressKey(keyname,mode)

参数说明:

参数/返回值 类型 说明
keyname 文本型 必填参数,为'BACK','MENU'和'HOME'三项之一
mode 逻辑型 可选参数,控制是否长按,true表示长按,false表示不长按
ret 文本型 返回值为0时表示成功

脚本实例:
ret = pressKey('BACK',false)

函数:setWifiEnable 设置无线局域网开关

函数功能:设置无线局域网开关
函数语法:
  setWifiEnable(flag)

参数说明:

参数 类型 说明
flag 逻辑型 打开WIFI - true; 关闭WIFI - false
返回值 类型 说明
ret 逻辑型 开关设置变更前的状态 false - 关闭;true - 开启

脚本实例:

  1. setWifiEnable(true); --打开 Wifi
  2. setWifiEnable(false); --关闭 Wifi

函数:setAirplaneMode 设置飞行模式开关

函数功能:设置飞行模式开关
函数语法:
  setAirplaneMode(flag)

参数说明:

参数 类型 说明
flag 逻辑型 打开飞行模式 - true;关闭飞行模式 - false
返回值 类型 说明
ret 逻辑型 开关设置变更前的状态 false - 关闭;true - 开启

脚本实例:

  1. setAirplaneMode(true); --打开 飞行模式
  2. setAirplaneMode(false); --关闭 飞行模式

函数:setBTEnable 设置蓝牙开关

函数功能:设置蓝牙开关
函数语法:
  setBTEnable(flag)

参数说明:

参数 类型 说明
flag 逻辑型 打开蓝牙 - true;关闭蓝牙 - false
返回值 类型 说明
ret 逻辑型 开关设置变更前的状态 false - 关闭;true - 开启

脚本实例:

  1. setBTEnable(true); --打开 蓝牙
  2. setBTEnable(false); --关闭 蓝牙

函数:lockDevice 锁定设备

函数功能:锁定设备并关闭屏幕,仅支持iOS。
函数语法:
  lockDevice()

参数说明:
返回值:无

脚本实例:

  1. lockDevice();
  2. lua_exit();

函数:unlockDevice 解锁设备

函数功能:解除屏幕锁定状态,仅支持iOS。
函数语法:
  unlockDevice()

参数说明:
返回值:无

脚本实例:

  1. flag = deviceIsLock(); --判断屏幕锁定状态
  2. if flag == 0 then
  3. dialog("未锁定",3);
  4. else
  5. unlockDevice(); --解锁
  6. end

注意事项:

1.如果设备设置了锁屏密码,则此函数只能唤醒屏幕。

函数:deviceIsLock 设备锁定状态

函数功能:判断当前设备的屏幕锁定状态
函数语法:
  flag = deviceIsLock()

参数说明:

返回值 类型 说明
flag 整数型 0 == 表示设备未锁定;非0 == 表示设备已锁定

脚本实例:

  1. flag = deviceIsLock(); --判断屏幕锁定状态
  2. if flag == 0 then
  3. dialog("未锁定",3);
  4. else
  5. unlockDevice(); --解锁
  6. end

函数:vibrator 手机振动

函数功能:使手机振动一次。
函数语法:
  vibrator()

参数说明:
返回值:无

脚本实例:

  1. for var = 1,5 do
  2. vibrator(); --振动
  3. mSleep(1000); --持续 1
  4. end

注意事项:

1.使用此函数需在移动设备设置里打开震动选项。

函数:resetIDLETimer 重置锁屏时间

函数功能:重置系统空闲时间,阻止自动锁屏,保持屏幕常亮。
函数语法:
  resetIDLETimer()

参数说明:
返回值:无

脚本实例:

  1. while true do
  2. mSleep(30 * 1000); --等待 30
  3. resetIDLETimer(); --重置锁屏计时
  4. end

注意事项:

安卓暂不支持此功能。

函数:resetScreenScale 取消屏幕缩放

函数功能:取消屏幕比例缩放设置,一般与setScreenScale配套使用。
函数语法:
  resetScreenScale()

参数说明:
返回值:无

脚本实例:

  1. setScreenScale(540,960) --或者setScreenScale(540,960,0)效果相同
  2. resetScreenScale() --取消缩放

函数:playAudio 播放音频

函数功能:在后台播放指定的声音文件
函数语法:
  playAudio(file)

参数说明:

参数 类型 说明
file 文本型 音频文件名,支持mp3

返回值:无

脚本实例:

  1. playAudio("music.mp3") -- 播放音乐文件music.mp3
  2. mSleep(5000)
  3. stopAudio() --停止播放音频文件

注意事项:

1.如果播放一个音频文件后,使用此函数播放另一音频文件,将会先停止正在播放的音频,再播放第二段音频文件。
2.用于播放的音乐文件需置于脚本对应的res文件夹内。

函数:stopAudio 停止播放音频

函数功能:停止正在播放的音频
函数语法:
  stopAudio()

参数说明:
返回值:无

脚本实例:

  1. playAudio("music.mp3") -- 播放音乐文件music.mp3
  2. mSleep(5000)
  3. stopAudio() --停止播放音频文件

注意事项:

如果播放一个音频文件后,使用此函数播放另一音频文件,将会先停止正在播放的音频,再播放第二段音频文件。

函数:setTimer 规定时间之后调用指定函数

函数功能:规定时间之后,调用指定的函数,同时把参数输入
函数语法:
  setTimer(time,func,arg1,arg2,...)

参数说明:

参数 类型 说明
time 数字型 当前时间到调用函数的时间间隔,毫秒
func 函数 需要调用的函数名称
arg1,arg2,... 变量 调用指定的函数时需要输入的参数,不定项

返回值:无

脚本实例:

  1. --每隔2000毫秒toast提示一次a+b+c的结果
  2. function func(a,b,c)
  3. toast(a+b+c)
  4. a=a+1
  5. b=b+1
  6. c=c+1
  7. setTimer(2000,func,a,b,c)
  8. end
  9. setTimer(2000,func,0,1,2)
  10. --等待运行
  11. mSleep(2000)
  12. mSleep(2000)
  13. mSleep(2000)
  14. mSleep(2000)
  15. mSleep(2000)

注意事项:

1.如定义了一段时间运行的函数,需在函数调用之前预留充裕的时间。
2.支持引擎版本:1.7.4或更新

函数:mSleep 延时

函数功能:发送系统等待事件。
函数语法:
  mSleep(interval)

参数说明:

参数 类型 说明
interval 整数型 单位为毫秒,脚本暂停执行的时间长度

脚本实例:

  1. mSleep(5000);
  1. touchDown(1, 200, 300); --按下
  2. mSleep(3000); --延迟 3
  3. touchUp(1, 200, 300); --抬起

注意事项:

1.延迟函数一般是用来模拟人在界面上的操作,因此要考虑人在各种情况下的延迟、界面加载时的响应时间。
2.延迟间隔不可过短,当 interval <= 50 ms 时,延迟精确度大幅下降,当 interval <= 16 ms 时,实际延迟约在16 ms左右。
3.请勿将此函数用于长时间的精确计时。
4.1 秒 (s) = 1000 毫秒 (ms)。

函数:toast 提示

函数功能:以HUD方式显示提示信息。
函数语法:
  toast(text)

参数说明:

参数 类型 说明
text 文本型 提示信息,将在设备屏幕上以HUD形式显示

返回值:无

脚本实例:

  1. toast("欢迎使用叉叉脚本!");
  2. mSleep(1000);
  3. toast("本脚本仅供演示toast函数效果。\n提示信息可以换行。");

注意事项:

该函数所产生的提示信息将以HUD形式显示在屏幕上,该函数所产生的提示信息可能会影响当前屏幕的找色,请合理使用。

函数:dialog 提示框

函数功能:弹出提示信息
函数语法:
  dialog(text, time)

参数说明:

参数 类型 说明
text 文本型 提示信息,将在设备屏幕上以弹窗形式显示
time 整数型 提示信息显示的时间,不限时间请填0

返回值:无

脚本实例:

  1. dialog("欢迎使用叉叉脚本!", 5);
  2. mSleep(1000);
  3. dialog("本脚本仅供演示对话框的用法。\n提示信息可以换行。",0);

注意事项:

1.time 参数时间设置过短有可能因出现时间太短看不清楚。
2.该函数仅供呈现提示信息给用户,不可接收返回值。
3.该函数所产生的提示窗口显示的时候会影响当前屏幕取色,请在合理的位置使用该函数。
4.关于转义字符:\n 为换行,请查阅 Lua 转义字符表。
5.time 参数可省略,如省略将按 0 处理。

函数:dialogRet 带按钮的对话框

函数功能:弹出提示信息,并提供 1 ~ 3 个按钮给用户选择。
函数语法:
  choice = dialogRet(text, cbtn, btn1, btn2, time)

参数说明:

参数 类型 说明
Text 文本型 提示信息
cbtn 文本型 默认按钮标题,不需要请填 ""
btn1 文本型 可选按钮 1,不需要请填 ""
btn2 文本型 可选按钮 2,不需要请填 ""
time 整数型 提示信息显示的时间,不限时间请填 0
返回值 类型 说明
choice 整数型 返回用户按下按钮的序号 cbtn == 0;btn1 == 1;btn2 == 2;如用户在规定显示时间内未进行选择,返回值为 -1

脚本实例:

  1. choice = dialogRet("请选择您的屏幕方向:", "横屏", "竖屏", "", 0);
  1. choice = dialogRet("请选择您的屏幕方向:", "HOME键在下", "HOME键在左", "HOME键在右", 0);
  1. dialogRet("请花30秒仔细阅读该许可协议。", "", "", "", 30);

注意事项:

1.请勿将三个按钮都设置为空,再将 time 参数设置为 0,这样将造成出现无法消失也没有按钮的 对话框,造成设备无法进行其它操作,只能重启。
2.cbtn 总是对话框的最右边或者最下面的按钮。

函数:dialogInput 带参数的对话框

函数功能:弹出提示信息,并提供 1 ~ 2 个编辑框给用户输入。
函数语法:
  text_a,text_b = dialogInput(title, format, btn)

参数说明:

参数 类型 说明
title 文本型 提示标题
format 文本型 编辑框中浅色的提示文字
btn 文本型 确认按钮标题
返回值 类型 说明
text_a,text_b 文本型 返回用户输入的文本

脚本实例:

  1. text_a = dialogInput("请输入循环副本的次数", "在这里输入次数", "确认");
  2. mSleep(1000);
  1. text_a, text_b = dialogInput("请输入使用的设置方案","在这里输入方案编号#在这里输入次数","确认");
  2. mSleep(1000);
  3. if text_b ~= "" and text_a ~= "" then --如果均已填写
  4. dialog("打本信息:"..text_b.." 次数 "..text_a.." 。", 5);
  5. mSleep(1000);
  6. else --未填写完整
  7. dialog("请完整填写打本的设置信息", 5);
  8. mSleep(1000);
  9. lua_exit()
  10. end

注意事项:

1.使用该函数都要对用户输入的数据进行一定的检查,例如要求非空、长度不得少于。
2.需要注意使用双编辑框时,函数返回的两个字符串顺序与 format中的顺序相反。
3.由于对话框事件需要响应时间,所以建议使用对话框时配合设置相应的延迟。

函数:sysLog 系统日志

函数功能:输出系统日志 NSLog
函数语法:
  sysLog(contents)

参数说明:

参数 类型 说明
content 文本型 需要显示的日志内容

返回值:无

注意事项:

该函数将日志输出到对应平台的开发窗口

函数:fileLogWrite 输出日志到文件

函数功能:输出日志到文件
函数语法:
  fileLogWrite(file,date,tag,msg)

参数说明:

参数 类型 说明
file 文本型 日志名
date 整数型 文件名是否添加日期后缀,0-不添加,1-添加。选择1的文件名称-->/tmp/Good-20170401.log
tag 文本型 标签,便于查看日志
msg 文本型 写入日志文件的内容

返回值:无

脚本实例:

  1. fileLogWrite("Name",1,"INFO","这是写入日志文件的内容")

注意事项:

1.该函数目前仅支持开发助手
2.该函数将日志输出到对应平台日志文件路径:
android:/sdcard/
iOS越狱:/tmp/
3.支持引擎版本:1.7.4或更新

函数:getCloudContent 获取云端自定义公告

函数功能:获取开发者平台公告服务模块中表单的内容
函数语法:
  content, err = getCloudContent(key,token,default_msg)

参数说明:

参数 类型 说明
key 文本型 指定需要获取公告服务表中的key值
token 文本型 开发助手调试中用于获取公告服务测试环境表单中数据的调试口令,在开发者平台中获取
default_msg 文本型 (选填)获取key对应value值失败时,将该默认值作为结果返回
返回值 类型 说明
content 文本型 从公告服务表单中取得对应的value值,正式环境与测试环境的数据分别配置
err 整数型 返回错误的类型:0 - 正常获取,1 - 网络错误,999 - 未知错误

脚本实例:

  1. content, err = getCloudContent("key", "此处十六位调试口令", "没有正确获取到公告信息")
  2. sysLog(string.format("getCloudContent return content = %s, err = %s", tostring(content), tostring(err)));
  3. if err == 0 then
  4. dialog(content)
  5. elseif err == 1 then
  6. dialog("网络错误")
  7. elseif err == 999 then
  8. dialog("未知错误")
  9. end

注意事项:

1.调试口令在开发者平台中生成,用于开发助手测试时获取测试环境的公告服务表单使用,正式环境中该密钥参数不生效。
2.该API需要保证网络通畅才能获取到对应信息,请勿用于存放重要信息。
3.支持引擎版本:1.7.5或更新。

函数:setStringConfig 存字符串

函数功能:将字符串存入配置文件
函数语法:
  setStringConfig("key","string")

参数说明:

参数 类型 说明
key1 文本型 将要写入的参数名称
string1 文本型 将要写入参数的内容

返回值:无

脚本实例:

  1. sex = getStringConfig("gender","male");
  2. toast(sex) -- 未对“gender”进行新的赋值,toast结果为默认值"male"
  3. setStringConfig("gender","female");
  4. sex = getStringConfig("gender","male");
  5. toast(sex) -- toast结果为新的赋值"female"

函数:getStringConfig 取字符串

函数功能:读取配置文件的字符串
函数语法:
  ret = getStringConfig("key","default_string")

参数说明:

参数 类型 说明
key1 文本型 将要读取的参数名称
default_string 文本型 参数"key1"所对应的默认值,如果没有对key1进行新的赋值,或无法找到对key1的赋值,将返回默认值“default_string”
返回值 类型 说明
ret 文本型 获取到名为"key1"的参数当前的值

脚本实例:

  1. sex = getStringConfig("gender","male");
  2. toast(sex) -- 未对“gender”进行新的赋值,toast结果为默认值"male"
  3. setStringConfig("gender","female");
  4. sex = getStringConfig("gender","male");
  5. toast(sex) -- toast结果为新的赋值"female"

函数:setNumberConfig 存入数值

函数功能:将数值存入配置文件
函数语法:
  setNumberConfig("key",num)

参数说明:

参数 类型 说明
key2 文本型 将要写入的参数名称
num1 数字型 将要写入参数的数值

返回值:无

脚本实例:

  1. a = getNumberConfig("age",18);
  2. toast(a) -- toast结果"18"
  3. setNumberConfig("age",20);
  4. a = getNumberConfig("age",18);
  5. toast(a) -- toast结果"20"

函数:getNumberConfig 读取数值

函数功能:读取配置文件的数值
函数语法:
  num = getNumberConfig("key",default_num)

参数说明:

参数 类型 说明
key2 文本型 将要读取的参数名称
default_num 数字型 参数"key2"所对应的默认值,如果没有对key2进行新的赋值,或无法找到对key2的赋值,将返回默认值 default_num
返回值 类型 说明
num 数字型 获取到名为"key2"的参数当前的值

脚本实例:

  1. a = getNumberConfig("age",18);
  2. toast(a) -- toast结果"18"
  3. setNumberConfig("age",20);
  4. a = getNumberConfig("age",18);
  5. toast(a) -- toast结果"20"

函数:readPasteboard 读取剪贴板

函数功能:读写系统剪贴板
函数语法:
  string = readPasteboard()

参数说明:

返回值 类型 说明
string 文本型 写入或读出的剪贴板字符串

脚本实例:

  1. string = readPasteboard(); --读取剪贴板内容
  2. mSleep(1000); --延迟 1 秒等待响应
  3. inputText(string); --输入字符串

函数:writePasteboard 写入剪贴板

函数功能:读写系统剪贴板
函数语法:
  writePasteboard(string)

参数说明:

参数 类型 说明
string 文本型 写入的剪贴板字符串

返回值:无

脚本实例:

  1. file = io.open("test.txt" ,"r"); --以只读方式打开一个文本文件
  2. if file then --如打开成功
  3. writePasteboard(file:read()); --写入到剪贴板
  4. file:close(); --关闭文件
  5. end

注意事项:

1.该函数将覆盖系统剪贴板,如有重要数据储存在剪贴板请事先备份。

函数:lua_exit 退出脚本执行

函数功能:直接终止脚本。
函数语法:
  lua_exit()
  

参数说明:
返回值:无

脚本实例:

  1. ret = dialogRet("该脚本不支持当前手机分辨率", "继续", "退出","",0);
  2. if ret == 0 then --如果按下"继续"按钮
  3. init("0",0); --开始初始化
  4. else
  5. lua_exit(); --否则退出脚本
  6. end

函数:lua_restart 重载脚本

函数功能:重新加载运行脚本
函数语法:
  lua_restart()
  

参数说明:
返回值:无

注意事项:

此函数作用相当于停止脚本后重新运行脚本。

函数:beforeUserExit 终止运行之前运行

函数功能:在用户主动终止脚本运行之前执行
函数语法:
  beforeUserExit()

参数说明:
返回值:无

脚本实例:

  1. function beforeUserExit()
  2. dialog("OK",0)
  3. end
  4. for var = 1,30 do
  5. mSleep(1000)
  6. sysLog("var")
  7. end

注意事项:

1.函数名必须为 beforeUserExit才能够被识别,请勿在函数体中使用死循环,否则会造成脚本无法终止或其他不可预料的问题。
2.此函数可以被 lua_exit()、悬浮窗停止、远程接口停止 触发。

函数:getEngineVersion 获取脚本引擎的版本号

函数功能:获取当前应用使用中的脚本引擎的版本号
函数语法:
  ver = getEngineVersion()

参数说明:

返回值 类型 说明
ver 文本型 返回当前引擎的版本号

脚本实例:

  1. ver = getEngineVersion()
  2. sysLog(string.format('当前版本号: %s', ver))

函数:getOSType 获取系统类型

函数功能:获取系统类型
函数语法:
  ver = getOSType()

参数说明:

返回值 类型 说明
ver 文本型 返回当前系统的类型;android系统返回“android”,iOS系统返回“iOS”

脚本实例:

  1. ver = getOSType()
  2. if ver == "android" then
  3. sysLog("安卓系统")
  4. elseif ver == "iOS" then
  5. sysLog("苹果系统")
  6. end

函数:isPriviateMode 获取系统环境类型

函数功能:获取系统环境类型
函数语法:
  ver = isPriviateMode()

参数说明:

返回值 类型 说明
ver 文本型 返回当前系统的类型:返回值1、0;1-越狱/ROOT环境;0-免越狱/免ROOT环境

脚本实例:

  1. ver = isPriviateMode()
  2. if ver == 0 then
  3. toast("当前为免越狱/免ROOT环境")
  4. elseif ver == 1 then
  5. toast("当前为越狱/root环境")
  6. end

注意事项:

1.支持引擎版本:1.7.4或更新

函数:getSystemProperty 获取系统常量属性

函数功能:获取系统常量属性,仅安卓可用
函数语法:
  value = getSystemProperty('key')

参数说明:

参数 类型 说明
key 文本型 CPU构架 - 'ro.arch'; 手机产品号 - 'ro.build.product'
返回值 类型 说明
value 文本型 返回所获取的系统常量属性结果

脚本实例:

  1. sysLog('CPU构架: ' .. getSystemProperty('ro.arch'))
  2. sysLog('手机产品号:' .. getSystemProperty('ro.build.product'))

函数:getLocalInfo 获取当前系统语言属性

函数功能:获取当前系统语言属性
函数语法:
  ret = getLocalInfo()

参数说明:

返回值 类型 说明
ret 文本型 获取到的当前系统语言,格式:语言-国家,例如:zh-CN, es-US,用于支持多语言脚本适配

脚本实例:

  1. ret = getLocalInfo()
  2. sysLog(string.format('当前系统语言: %s', ret))

函数:getUserID 获取用户ID

函数功能:获取用户的识别ID
函数语法:
  id = getUserID()

参数说明:

返回值 类型 说明
id 文本型 表示拿到的用户的ID,没有登录时则返回null

脚本实例:

  1. sysLog("id: "..getUserID())

函数:getScreenDPI 获取当前设备屏幕DPI

函数功能:获取当前设备屏幕DPI,仅安卓适用
函数语法:
  ret = getScreenDPI()

参数说明:

返回值 类型 说明
ret 文本型 返回的当前设备屏幕DPI

脚本实例:

  1. ret = getScreenDPI()
  2. sysLog(string.format('当前设备屏幕DPI: %s', ret))

函数:getDeviceIMEI 获取当前设备IMEI码

函数功能:获取当前设备IMEI码,仅安卓适用
函数语法:
  ret = getDeviceIMEI()

参数说明:

返回值 类型 说明
ret 文本型 返回的当前设备IMEI码

脚本实例:

  1. ret = getDeviceIMEI()
  2. sysLog(string.format('当前设备IMEI码: %s', ret))

函数:getDeviceIMSI 获取当前设备IMSI码

函数功能:获取当前设备IMSI码,仅安卓适用
函数语法:
  ret = getDeviceIMSI()

参数说明:

返回值 类型 说明
ret 文本型 返回的当前设备IMSI码

脚本实例:

  1. ret = getDeviceIMSI()
  2. sysLog(string.format('当前设备IMSI码: %s', ret))

函数:getDeviceUUID 获取当前设备UUID

函数功能:获取当前设备UUID,仅iOS适用
函数语法:
  ret = getDeviceUUID()

参数说明:

返回值 类型 说明
ret 文本型 返回的当前设备UUID

脚本实例:

  1. ret = getDeviceUUID()
  2. sysLog(string.format('当前设备UUID: %s', ret))

函数:getBatteryLevel 获取电池状态

函数功能:获取电池充电状态、电量
函数语法:
  charge,level = getBatteryLevel()

参数说明:

返回值 类型 说明
charge 整数型 0表示没充电,1表示充电 (充电状态未知返回-1,同时剩余电量为-1)
level 整数型 表示剩余电量,0-100

脚本实例:

  1. charge,level = getBatteryLevel()
  2. if charge == 0 then
  3. toast("当前电池未充电,电量剩余 "..level)
  4. elseif charge == 1 then
  5. toast("当前电池充电中,电量剩余 "..level)
  6. elseif charge == -1 then
  7. toast("当前电池充电状态未知,电量剩余未知")
  8. end

注意事项:

1.支持引擎版本:1.7.4或更新

函数:getScreenDirection 获取屏幕方向

函数功能:获取设备当前屏幕方向
函数语法:
  ret = getScreenDirection()

参数说明:

返回值 类型 说明
ret 整数型 Android:0-竖屏, 1-橫屏; iOS:0-竖屏,1-横屏(Home右),2-横屏(Home左), -1(Unknow)

脚本实例:

  1. ret = getScreenDirection()
  2. if ret == 0 then
  3. toast("当前屏幕方向为竖屏")
  4. elseif ret == 1 then
  5. ver = getOSType()
  6. if ver == "iOS" then
  7. toast("当前屏幕方向为横屏,HOME键在右")
  8. elseif ver == "android" then
  9. toast("当前屏幕方向为横屏")
  10. end
  11. elseif ret == 2 then
  12. toast("当前屏幕方向为横屏,HOME键在左")
  13. elseif ret == -1 then
  14. toast("当前屏幕方向Unknow")
  15. end

注意事项:

1.iOS版开发助手中该函数返回值跟随init指定的方向,未指定的情况下返回值为-1。
2.支持引擎版本:1.7.4或更新

函数:getUserCredit 获取用户付费类型和套餐剩余时间

函数功能:获取用户付费类型和套餐剩余时间
函数语法:
  buyState,validTime,res=getUserCredit()

参数说明:

返回值 类型 说明
buyState 整数型 用户付费类型,0 - 试用用户 1 - 付费用户
validTime 整数型 用户当前套餐购买时长,单位为秒,试用用户的情况下会返回0
res 整数型 返回错误代码,0 - 正常, 非0 - 出错

脚本实例:

  1. buyState,validTime,res=getUserCredit()
  2. if buyState ~= 0 then
  3. diaLog("您是付费用户")
  4. end

注意事项:

1.支持引擎版本:1.8.30或更新

函数:createHUD 创建HUD内容

函数功能:创建、显示、隐藏HUD内容
函数语法:
  id = createHUD()

参数说明:

返回值 类型 说明
id 整数型 用于标示HUD

脚本实例:

  1. init("0",1)
  2. id = createHUD() --创建一个HUD
  3. showHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容
  4. mSleep(2000)
  5. showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容
  6. mSleep(5000)
  7. hideHUD(id) --隐藏HUD
  8. mSleep(3000)

注意事项:

1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。

函数:showHUD 显示HUD内容

函数功能:创建、显示、隐藏HUD内容
函数语法:
  showHUD(id,text,size,color,bg,pos,x,y,width,height)

参数说明:

参数 类型 说明
id 整数型 用于标示HUD
text 文本型 提示信息,将在屏幕上以HUD形式显示
size 整数型 表示提示信息的字体大小
color 文本型 表示提示信息的字体颜色,格式为ARGB
bg 文本型 表示提示信息的背景颜色,可以是ARGB,也可以是图片文件名称
pos 整数型 表示提示信息的原点位置,0 - 左上角,1 - 居中,2 - 水平居中, 3 - 垂直居中
x,y 整数型 表示提示信息相对原点的坐标偏移值
width,height 整数型 表示提示信息显示的宽高

返回值:无

脚本实例:

  1. init("0",1)
  2. id = createHUD() --创建一个HUD
  3. showHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容
  4. mSleep(2000)
  5. showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容
  6. mSleep(5000)
  7. hideHUD(id) --隐藏HUD
  8. mSleep(3000)

注意事项:

1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。

函数:hideHUD 隐藏HUD内容

函数功能:创建、显示、隐藏HUD内容
函数语法:
  hideHUD(id)

参数说明:

参数 类型 说明
id 整数型 用于标示HUD

返回值:无

脚本实例:

  1. init("0",1)
  2. id = createHUD() --创建一个HUD
  3. showHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容
  4. mSleep(2000)
  5. showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容
  6. mSleep(5000)
  7. hideHUD(id) --隐藏HUD
  8. mSleep(3000)

注意事项:

1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。

函数:asyncExec 异步网络请求

函数功能:asyncExec 异步httpget、httppost请求
函数语法:
  asyncExec()

脚本实例:

  1. sysLog("test begin")
  2. -- 异步httpget请求
  3. asyncExec({
  4. type = "httpget", -- [string] 指定httpget类型
  5. immediate = false, -- [bool] 默认false, 设置true会独立开启线程执行任务
  6. url = "http://httpbin.org/get?x=1&y=2", -- [string] 请求的URL地址
  7. callback = function (result) -- [function] 请求回调函数
  8. -- 回调结果table
  9. assert(type(result) == "table")
  10. --[[
  11. 返回数据格式: { code = [int]错误码, data = [string]服务器返回数据 }
  12. code -1: 请求出错
  13. -2: 请求超时
  14. -3: 强制关闭
  15. 其他: http status code
  16. ]]--
  17. sysLog("httpget callback: code = " .. result.code .. " data = " .. result.data)
  18. -- 注意: 虽然请求会异步执行, 但回调函数依然在lua主线程执行, 不要在回调里执行其他阻塞操作
  19. end
  20. })
  21. -- 异步httppost请求
  22. asyncExec({
  23. type = "httppost", -- [string] 指定httppost类型
  24. immediate = true, -- [bool] 默认false, 设置true会独立开启线程执行任务
  25. url = "http:/httpbin.org/post", -- [string] 请求的URL地址
  26. content = "test content 2", -- [string] post请求的数据
  27. callback = function (result) -- [function] 请求回调函数
  28. -- 回调结果table
  29. assert(type(result) == "table")
  30. -- httpgethttppost返回数据格式一致
  31. sysLog("httppost callback: code = " .. result.code .. " data = " .. result.data)
  32. end
  33. })
  34. local t = 0
  35. while t < 10 do
  36. mSleep(1000)
  37. t = t + 1
  38. end
  39. sysLog("test end")

函数:setUIOrientation 设置UI方向和HUD方向

函数功能:设置UI方向和HUD方向,仅iOS可用
函数语法:
  setUIOrientation(mode)

参数说明:

参数 类型 说明
mode 整数型 用于设置UI及HUD的全局方向类型,0表示跟随游戏;1表示home在右侧;2表示home在左侧

返回值:无

脚本实例:

  1. init("",1)
  2. setUIOrientation(0)

注意事项:

1.只适用于iOS系统,Andorid系统不可用

badboy开源工具库

Badboy是专为叉叉脚本引擎开发的工具类,代码全部以开源的方式提供,目前有以下的模块:

  1. 进入https://github.com/boyliang/lua_badboy,下载项目源码;
  2. 把项目当中内容,复制到src目录下;
  3. 在main.lua中加入你的脚本逻辑;
  4. 使用xsp打包工具即完成out.xsp

使用方法:
请在脚本开头插入 local bb = require("badboy") 即可调用扩展库中所有函数。

JSON模块

newArray 新建数组对象
newObject 新建对象
decode json字符串转成talbe对象
encode table对象转换成压缩的json字符
encode_pretty table对象转换成优雅的json字符

脚本实例:

  1. local bb = require("badboy")
  2. local json = bb.getJSON()
  3. local lua_value = json.decode('{"a": 1, "b":"boy", "c":{"d":1}}')
  4. local a_value = lua_value.a -- =1
  5. local b_balue = lua_value.b -- ="boy"
  6. local c_d_balue = lua_value.c.d -- =1
  7. local raw_json_text = json.encode(lua_value)
  8. local pretty_json_text = json.encode_pretty(lua_value)
  9. sysLog(raw_json_text)
  10. sysLog(pretty_json_text)

StringUtils模块

toCharTable 从字符串转字符数组
fromCharTable 从字符数组转字符串
toByteTable 从字符串转字节数组
fromByteTale 从字节数组转字符串
contains 是否包含子串
startWith 是否以某个子串开头
endsWith 是否以某个子中结束
...更多API请关注badboy项目源码文件\bblibs\StrUtilsAPI.lua

脚本实例:

  1. local bb = require("badboy")
  2. local strutils = bb.getStrUtils()
  3. local str = 'i am a badboy'
  4. --十六进制编码转换、SHA1计算、MD5计算
  5. local hex = str:tohex() -- 等同于 strutils.toHex(str)
  6. local sha1 = str:sha1() -- 等同于 strutils.SHA1(str)
  7. local md5 = str:md5() -- 等同于 strutils.md5(str)
  8. sysLog('hex:' .. hex)
  9. sysLog('sha1:' .. sha1)
  10. sysLog('md5:' .. md5)
  11. 输出内容:
  12. hex:69:20:61:6D:20:61:20:62:61:64:62:6F:79
  13. sha1:43386755b0ff2899e0a7895c45a0c051468d06cd
  14. md5:0663e75e1087668c30b527f5d9519185

UI模块

RootView:create 构造UI根对象
RootView:addView 添加子view
RootView:removeView 删除子view
RootView:removeViewByID 删除子view
Page:create 构建Page控件
Page:addView 添加子view
Page:removeView 删除子view
Page:removeViewByID 删除子view
Image:create 构造Image控件
Edit:create 构造Edit控件
Label:create 构造Label控件
...(所有属性都可以直接通过对象访问)

  1. local bb = require("badboy")
  2. bb.loaduilib()
  3. local rootview = RootView:create({style = ViewStyle.CUSTOME})
  4. local page = Page:create("page")
  5. page.text = "Page1"
  6. local page2 = Page:create("page2")
  7. page2.text = "Page2"
  8. local label = Label:create("Label", {color = "255, 255, 0"})
  9. label.text = "I love XX"
  10. local image = Image:create("image")
  11. image.src = "bg.png"
  12. local edit = Edit:create("edit", {prompt = "提示"})
  13. edit.align = TextAlign.LEFT
  14. local radiogroup = RadioGroup:create("radiogroup")
  15. radiogroup:setList('男', '女', '嬲', '奻')
  16. radiogroup:setSelect(3)
  17. local checkboxgroup = CheckBoxGroup:create('checkboxgroup')
  18. checkboxgroup:setList('XX', 'OO', 'AA', 'BB')
  19. checkboxgroup:setSelects(2, 3)
  20. rootview:addView(page) --把page添加到rootview
  21. rootview:addView(page2)
  22. page:addView(label) --把label添加到page
  23. -- page:addView(label) --labelid重复,这里会报错
  24. page:addView(image) --把image添加到page
  25. page:addView(checkboxgroup)
  26. page:addView(radiogroup)
  27. page:removeView(label1) --从page中删除label
  28. uijson = json.encode(rootview)
  29. showUI(uijson)

POS模块

distanceBetween 计算距离
click 单击
touchMoveTo 精确滑动
angleBetween 计算角度
polarProjection 根据角度和距离找点
isColorClick 根据颜色进行点击

  1. local bb = require("badboy")
  2. local pos = bb.loadpos()
  3. p1 = pos:new(0, 0, 0x123456)
  4. p2 = pos:new(1, 2)
  5. sysLog(p1:distanceBetween(p2))
  6. sysLog(p1:angleBetween(p2))
  7. p2 = p1:polarProjection(4, 30)
  8. sysLogFmt('p2[%d, %d]', p2.x, p2.y)

utils模块

sysLogFmt 格式化字符串输出
sysLogLst 任意内容输出
tap 模拟一次点击
swip 模拟一次滑动
cmpColor 指定颜色对比

  1. -- utils test
  2. local bb = require("badboy")
  3. bb.loadutilslib()
  4. i = 3
  5. j = 6.9
  6. s = 'good boy'
  7. sysLogFmt('i=%d, j=%f, s=%s', i, j, s)
  8. sysLogLst(i, j, s)

LuaSocket模块

LuaSocket 是 Lua 的网络模块库,它可以很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。详细使用说明关注badboy项目源码文件main.lua,API参考见http://w3.impa.br/~diego/software/luasocket/reference.html

DNS

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local socket = bb.socket
  4. local dns = socket.dns
  5. sysLog('localhostIP: ' .. dns.toip('localhost'))
  6. sysLog('result: ' .. (dns.tohostname('59.37.96.63') or 'nil'))
  7. sysLog('hostname: ' .. dns.gethostname())
  8. sysLog('addinfo: ' .. tostring(dns.getaddrinfo('localhost')))

httpGet请求

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local http = bb.http
  4. local ltn12 = bb.ltn12
  5. res, code = http.request('http://www.baidu.com')
  6. -- 等价于
  7. -- local response_body = {}
  8. -- res, code = http.request({
  9. -- url = 'http://www.baidu.com',
  10. -- sink = ltn12.sink.table(response_body)
  11. -- })
  12. if code == 200 then
  13. sysLog(res)
  14. dialog(res, 0)
  15. end
  16. --获取外网ip地址
  17. local bb = require("badboy")
  18. bb.loadluasocket()
  19. local http = bb.http
  20. local res, code = http.request('http://www.ip.cn/');
  21. if code == 200 then
  22. local i,j = string.find(res, '%d+%.%d+%.%d+%.%d+')
  23. local ipaddr =string.sub(res,i,j)
  24. dialog(ipaddr, 0)
  25. end

1.返回的2个参数中,res 是 http body 的内容,也就是请求网页的内容,code 是 http 状态码,返回200的话就表示正常返回。
2.如果传入的是 table 的话,就需要用一个容器来接收 http body 的内容。

httpPost请求

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local http = bb.http
  4. local response_body = {}
  5. local post_data = 'asd';
  6. res, code = http.request{
  7. url = 'http://127.0.0.1/post.php',
  8. method = "POST",
  9. headers =
  10. {
  11. ['Content-Type'] = 'application/x-www-form-urlencoded',
  12. ['Content-Length'] = #post_data,
  13. },
  14. source = ltn12.source.string('data=' .. post_data),
  15. sink = ltn12.sink.table(response_body)
  16. }

1.这里注意记得 method 传入 POST, 因为默认是 GET。
2.headers 参数,由一个 table 组成,key 为 header,value 为 header 内容。
3.source 参数,这里是填入 POST 的参数,多个数据的情况用 & 隔开,例如 "data1=a&data2=b"。
4.此代码仅为举例说明,请勿直接复制使用。

挂载代理

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local http = bb.http
  4. http.PROXY = 'http://127.0.0.1:8888' --代理服务器地址
  5. local result, code = http.request('http://www.baidu.com')
  6. dialog(result or tostring(code), 0)

以socket的方式访问

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local http = bb.http
  4. local host = 'www.baidu.com'
  5. local file = "/"
  6. local sock = assert(socket.connect(host, 80)) --创建一个 TCP 连接,连接到 HTTP 连接的标准 80 端口上
  7. sock:send('GET ' .. file .. ' HTTP/1.0\r\n\r\n')
  8. repeat
  9. local chunk, status, partial = sock:receive(1024) --以 1K 的字节块接收数据
  10. until status ~= 'closed'
  11. sock:close() -- 关闭 TCP 连接

smtp方法发送email

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local smtp = bb.smtp
  4. from = '<youmail@126.com>' -- 发件人
  5. --发送列表
  6. rcpt = {
  7. '<youmail@126.com>',
  8. '<youmail@qq.com>',
  9. '<youmail@gmail.com>',
  10. }
  11. mesgt = {
  12. headers = {
  13. to = 'youmail@gmail.com', -- 收件人
  14. cc = '<youmail@gmail.com>', -- 抄送
  15. subject = "This is Mail Title"
  16. },
  17. body = "邮件内容"
  18. }
  19. r, e = smtp.send{
  20. server = "smtp.126.com", --smtp服务器地址
  21. user = "youmail@126.com",--smtp验证用户名
  22. password = "******", --smtp验证密码
  23. from = from,
  24. rcpt = rcpt,
  25. source = smtp.message(mesgt)
  26. }
  27. if not r then
  28. dialog(e, 0)
  29. else
  30. dialog('发送成功!', 0)
  31. end

实现获取网络时间

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local socket = bb.socket
  4. server_ip = {
  5. "132.163.4.101",
  6. "132.163.4.102",
  7. "132.163.4.103",
  8. "128.138.140.44",
  9. "192.43.244.18",
  10. "131.107.1.10",
  11. "66.243.43.21",
  12. "216.200.93.8",
  13. "208.184.49.9",
  14. "207.126.98.204",
  15. "207.200.81.113",
  16. "205.188.185.33"
  17. }
  18. local function nstol(str)
  19. assert(str and #str == 4)
  20. local t = {str:byte(1,-1)}
  21. local n = 0
  22. for k = 1, #t do
  23. n= n*256 + t[k]
  24. end
  25. return n
  26. end
  27. local function gettime(ip)
  28. local tcp = socket.tcp()
  29. tcp:settimeout(10)
  30. tcp:connect(ip, 37)
  31. success, time = pcall(nstol, tcp:receive(4))
  32. tcp:close()
  33. return success and time or nil
  34. end
  35. local function nettime()
  36. for _, ip in pairs(server_ip) do
  37. time = gettime(ip)
  38. if time then
  39. return time
  40. end
  41. end
  42. end
  43. dialog(nettime(),0)

统计毫秒精度时间

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local socket = bb.socket
  4. local function sleep(sec)
  5. socket.select(nil,nil,sec);
  6. end
  7. local t0 = socket.gettime()
  8. sleep(0.4);
  9. local t1 = socket.gettime()
  10. dialog(t1 - t0, 0)

FTP 测试

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. -- [ftp://][<user>[:<password>]@]<host>[:<port>][/<path>][type=a|i]
  4. -- The following constants in the namespace can be set to control the default behavior of the FTP module:
  5. -- PASSWORD: default anonymous password.
  6. -- PORT: default port used for the control connection;
  7. -- TIMEOUT: sets the timeout for all I/O operations;
  8. -- USER: default anonymous user;
  9. local ftp = bb.ftp
  10. -- Log as user "anonymous" on server "ftp.tecgraf.puc-rio.br",
  11. -- and get file "lua.tar.gz" from directory "pub/lua" as binary.
  12. f, e = ftp.get("ftp://ftp.tecgraf.puc-rio.br/pub/lua/lua.tar.gz;type=i")
  13. -- Log as user "fulano" on server "ftp.example.com",
  14. -- using password "silva", and store a file "README" with contents
  15. -- "wrong password, of course"
  16. f, e = ftp.put("ftp://fulano:silva@ftp.example.com/README", "wrong password, of course")
  17. -- Log as user "fulano" on server "ftp.example.com",
  18. -- using password "silva", and append to the remote file "LOG", sending the
  19. -- contents of the local file "LOCAL-LOG"
  20. f, e = ftp.put{
  21. host = "ftp.example.com",
  22. user = "fulano",
  23. password = "silva",
  24. command = "appe",
  25. argument = "LOG",
  26. source = ltn12.source.file(io.open("LOCAL-LOG", "r"))
  27. }

取色器使用说明

抓图说明:
截图:于设备截图,会出现精度条圆圈标志,等待时间过长或其他意外情况 点击叉或者按Esc结束.截图后显示图片,右键图片名显示菜单,可关闭图片
保存:保存当前图片
载入:载入图片,也可以拖入图片
左转:左边旋转90度
右转:右边旋转90度
放大:快捷键ctrl + 滚轮上, 放大当前图片
缩小:快捷键ctrl + 滚轮下, 缩小当前图片
1:1 :快捷键ctrl + o, 100%显示当前图片
截图旋转方向: 截图默认旋转的方向
Home键在下相当于init("0", 0)
Home键在右相当于init("0", 1)
Home键左相当于init("0", 2)

尺寸显示:旋转后改变方向
取色:快捷键 1,2,3,4,5,6,7,8,9,0 或鼠标右键菜单取色
取色微调:键盘上下左右方向键移动

取色器快捷键表

数字键(1 2 3 4 5 6 7 8 9 0)
分别取色到第1~10个位置

Ctrl + 数字键(1 2 3 4 5 6 7 8 9 0)
分别取色到11~20个位置

A、S
取 [坐标位 A] 和 [坐标位 S] 作为左上右下坐标到选择范围

光标(↑ ↓ ← →)
鼠标指针定位移动 1 个像素

回车键/Ctrl + 鼠标左键点击
取色到剪贴板的首个空白位置,已取色的位置不会被覆盖,如果无空白位置则不取色

Shift + Delete
清除已勾选的点色信息

Ctrl + Shift + Delete
清除所有点色信息

F5
刷新所有点色信息为当前图片的值

Ctrl + L/Ctrl + R
分别对代码窗口1、2的内容进行代码测试

Shift + L/Shift + R
分别复制代码窗口1、2的内容

-
缩小视图

=
放大视图

Ctrl + Tab
切换到下一个文档

Ctrl + Shift + Tab
切换到上一个文档

放大镜功能说明:
选择范围: A,S快捷键或 按钮点击选择范围.会出现红色线,按Esc键取消选择.注意选取范围时可鼠标滚动滚轮
颜色数据反选:在复选框上按住鼠标左键往下或者往上拖动,移动范围内反选颜色数据
可全选全删

格式:自定义生成代码. 在IDE目录下data.lua可以编辑格式
在datacolorfg中自己添加格式为:

  1. {
  2. title = "",
  3. fScript = function(poslist,area, degree)
  4. end,
  5. sScript = function (poslist,area, degree)
  6. end,
  7. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注