屏幕模块
函数:screen.resolution() 屏幕分辨率
原函数名 : getScreenResolution
函数说明 : 获取当前屏幕分辨率。
函数方法 : screen.resolution();
返回值 : 整数型 width,height
返回值 | 类型 | 说明 |
---|---|---|
width | number | 获取到的当前屏幕宽度 |
height | number | 获取到的当前屏幕高度 |
示例
width, height = screen.resolution(); -- 将屏幕宽度和高度分别保存在变量width、height中
sys.dialog(string.format("%d,%d\n", width, height)); -- 将宽度和高度用提示框显示到屏幕上
--脚本判断使用的机器是否是iphone5
if width == 640 and height == 1136 then
sys.dialog("当前设备为iphone5")
else
sys.dialog("请在iphone5上使用本程序")
end
函数:screen.colorBits() 屏幕颜色位数
原函数名 : getScreenColorBits
函数说明 : 获取当前屏幕色彩位数。
函数方法 : screen.colorBits();
返回值 : 整数型 color
返回值 | 类型 | 说明 |
---|---|---|
color | number | 色彩位数 |
示例
color = screen.colorBits(); -- 将屏幕色彩位数保存在变量color中
sys.dialog(string.format("%d\n", color)); -- 将色彩位数用提示框显示到屏幕上
函数:screen.keep() 屏幕保持
原函数名 : keepScreen
函数说明 : 开启/关闭屏幕保持(缓存屏幕数据)。
函数方法 : screen.keep(是否保持 on, 二值化颜色数组 colors?, 二值化精度 fuzzy?);
返回值 : 无
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
on | boolean | 开启/关闭屏幕保持 | 必填 |
colors | number or table | 二值化颜色数组 | 非必填 |
fuzzy | 整数型 | 精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配 | 非必填 |
示例
screen.keep(true); -- 开启屏幕保持
if screen.getColor(100, 100) == 0x000000 or screen.getColor(200, 200) == 0x000000 then -- 进行2次取色, 由于启用了屏幕保持, 这2次取色不会重新获取2次屏幕图像, 这样可以提高性能
sys.dialog("yes"); --如果(100,100)和(200,200)坐标有一个颜色为黑色, 输出"yes"
else -- 否则
sys.dialog("no"); -- 输出"no"
end
screen.keep(false); -- 关闭屏幕保持
screen.keep(true, {0xffffff}, 90) -- 缓存屏幕并对其二值化
screen.snapshot("/var/touchelf/1.png") -- 截图,可下载此截图查看二值化后的屏幕缓存
screen.keep(false); -- 取消缓存
使用屏幕保持和不使用屏幕保持对比
function main()
socket = require('socket')
time = socket.gettime()
for i = 1,100 do
screen.getColor(1,i)
end
sys.log("没有屏幕保持:"..socket.gettime()-time)
time = socket.gettime()
screen.keep(true);
for i = 1,100 do
screen.getColor(1,i)
end
screen.keep(false);
sys.log("屏幕保持:"..socket.gettime()-time)
time = socket.gettime()
for i = 1,100 do
screen.keep(true);
screen.getColor(1,i)
screen.keep(false);
end
sys.log("每次找色都屏幕保持:"..socket.gettime()-time)
end
运行结果:
每次找色都屏幕保持:1.682479
屏幕保持:0.014437000000001
没有屏幕保持:1.708134
注意事项:
1,当使用screen.keep(true);开启屏幕保持时, 后续的找图、找色等函数不会重新获取屏幕图像, 而是使用开启屏幕保持之前的屏幕图像,否则每次使用找图找色等函数都将截取一次屏幕内容。
2,当使用 screen.keep(false);关闭屏幕保持时, 后续的找图、找色等函数会每次都重新获取屏幕图像。
3,安卓版支持性能模式的设备不需要使用此函数。
4,苹果版和安卓兼容模式下使用此函数可显著提升找色速度。
流程图:
函数:screen.rotate() 屏幕旋转
原函数名 : rotateScreen
函数说明 : 旋转屏幕的坐标体系, 后续的找图、找色、截图、触摸动作都会使用新的坐标体系
函数方法 : screen.rotate(旋转角度 deg);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
deg | number | 旋转角度 |
0: 保持原本的坐标体系。对于IOS设备来说, 此时HOME键在下方时的屏幕左上角为原点
90: 坐标系统向右转90度。对于IOS设备来说, 此时HOME键在右方时的屏幕左上角为原点
-90: 坐标系统向左转90度。对于IOS设备来说, 此时HOME键在左方时的屏幕左上角为原点
180: 坐标系统倒立。对于IOS设备来说, 此时HOME键在下方时的屏幕左上角为原点
示例
screen.rotate(90); -- 旋转坐标体系向右90度, 大多数横屏游戏使用此坐标体系.
touch.down(0, 100, 100); -- 发送触摸动作, 此时点击的点使用新的坐标体系.
touch.up(0);
示例 临时旋转后恢复原始坐标系
screen.rotate(90); -- 旋转坐标体系向右90度
screen.snapshot("/mnt/sdcard/a.png", 100, 100, 200, 200);--截一张新的坐标体系下的图
screen.rotate(0); -- 恢复坐标体系
函数:screen.getColor() 取色
原函数名 : getColor
函数说明 : 获取指定像素的颜色
函数方法 : screen.getColor(坐标X, 坐标Y);
返回值 : 整型 color
参数 | 类型 | 说明 |
---|---|---|
X | number | 将获取颜色值的X坐标 |
Y | number | 将获取颜色值的y坐标 |
返回值 | 类型 | 说明 |
---|---|---|
color | number | x,y坐标点的十进制颜色值 |
示例:
c = screen.getColor(100, 100); -- 将坐标为(100,100)的点的颜色保存在变量c中
if c == 0x0000ff then -- 如果该点颜色为0x0000ff(纯蓝色)
touch.down(0, 100, 100); -- 那么点击该坐标
touch.up(0);
end
---------------也可以写成-------------
if screen.getColor(100, 100) == 0x0000ff then -- 如果该点颜色为0x0000ff(纯蓝色)
touch.down(0, 100, 100); -- 那么点击该坐标
touch.up(0);
end
注意事项:
1,screen.getColor()返回的是十进制颜色值,如纯白色获取到的数值是16777215。十进制数值和十六进制颜色对比时,十六进制前面需加"0x"即"0xFFFFFF"。
2,在十六进制颜色值"0xAABBCC"中,"AA"对应的是红(R,Red),"BB"对应的是绿(G,Green),"CC"对应的是蓝(B,Blue)。
语法说明:
c = screen.getColor(100, 100); 中"="的作用是赋值,将screen.getColor(100, 100)获得的值赋值给c这个变量。
if screen.getColor(100, 100) == 0x0000ff then 中的"=="是关系运算符中等于的意思。
翻译成中文就是:如果 100,100这个坐标的颜色等于 0x0000ff 那么执行下面的语句。不等于的写法是"~="
函数:screen.getColorRGB() 取色RGB
原函数名 : getColorRGB
函数说明 : 获取指定像素颜色的R、G、B三个值
函数方法 : screen.getColorRGB(坐标X, 坐标Y);
返回值 : 整型 R,G,B
参数 | 类型 | 说明 |
---|---|---|
X | number | 将获取颜色值的X坐标 |
Y | number | 将获取颜色值的Y坐标 |
返回值 | 类型 | 说明 |
---|---|---|
R | number | x,y坐标点的颜色R(红色)值 |
G | number | x,y坐标点的颜色G(绿色)值 |
B | number | x,y坐标点的颜色B(蓝色)值 |
示例:
r, g, b = screen.getColorRGB(100, 100); -- 将坐标为(100,100)的点的颜色的R、G、B分别保存在变量r、g、b中
if r == 0x00 and b == 0x00 and g == 0xff then -- 如果该点颜色为0x0000ff(纯蓝色)
touch.down(0, 100, 100); -- 那么点击该坐标
touch.up(0);
end
函数:screen.findColor() 找色
原函数名 : findColor, findColorFuzzy, findColorInRegion, findColorInRegionFuzzy, findMultiColorInRegionFuzzy, findMultiColorInRegionFuzzyEx
函数说明 : 寻找符合指定颜色的坐标。
函数方法 : screen.findColor(颜色数组 colors, 精度 fuzzy?, 左上角坐标x?, 左上角坐标y?, 右下角坐标x?, 右下角坐标y?, 返回类型all?);
返回值 : 整数型 x, y
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
colors | table | 要找的颜色数组 | 必填 |
fuzzy | number | 精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配 | 非必填,默认100 |
ltx | number | 欲寻找的区域左上角的X坐标 | 非必填,默认全屏 |
lty | number | 欲寻找的区域左上角的Y坐标 | 非必填,默认全屏 |
rbx | number | 欲寻找的区域右下角的X坐标 | 非必填,默认全屏 |
rby | number | 欲寻找的区域右下角的Y坐标 | 非必填,默认全屏 |
all | boolean | 是否返回所有符合条件的坐标 | 非必填,默认返回第一个坐标 |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标Y值,未找到返回 -1 |
all为true的返回值 | 类型 | 说明 |
---|---|---|
table | table | 范围内找到的坐标table,未找到返回 {} 空数组 |
全屏找色示例
x, y = screen.findColor({0x0000ff}); -- 在全屏范围找到第一个颜色为0x0000ff的点, 将其坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then -- 如果找到了
touch.down(0, x, y); -- 点击那个点
touch.up(0);
end
注意事项:
1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
2,尽量不要使用这个函数,全屏找色耗费资源,而且由于颜色可能会产生肉眼不可见的变化导致找色失败,建议使用区域模糊找色。
全屏模糊找色示例
x, y = screen.findColor({0x0000ff}, 90); -- 在全屏范围找到第一个颜色为0x0000ff的点, 精确度为90%, 将其坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then -- 如果找到了
touch.down(0, x, y); -- 点击那个点
touch.up(0);
end
注意事项:
1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
2,全屏找色耗费资源,尽量不要使用这个函数。
单点模糊找色示例
x, y = screen.findColor({0x0000ff}, 90, 100, 100, 100, 100); -- 将左上角和右下角两个坐标写成一样,作用就是判断(100,100)这个坐标颜色是否为0x0000ff, 精确度为90%, 将其坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then -- 如果找到了
touch.down(0, x, y); -- 点击那个点
touch.up(0);
end
区域模糊找色示例
x, y = screen.findColor({0x0000ff}, 90, 100, 100, 200, 200); -- 在区域[(100,100)(200,200)]范围找到第一个颜色为0x0000ff的点, 精确度为90%, 将其坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then -- 如果找到了
touch.down(0, x, y); -- 点击那个点
touch.up(0);
end
区域模糊找色不断降低精确度的写法
for sim = 100, 50, -1 do --使用 for 循环不断降低精确度(建议精确度不低于50%)
x, y = screen.findColor({0x0000ff}, sim, 100, 100, 100, 100);
if x ~= -1 and y ~= -1 then --如果在指定区域找到某点符合条件
touch.down(0, x, y); --那么单击该点
touch.up(0);
break; --并跳出循环
end
end
多点区域模糊找色示例
-- 在区域[(10,10)(200,200)]范围内以90%的精确度找一个满足以下条件的点:
-- 1. 其颜色为0x0000ff
-- 2. 其X坐标+10,Y坐标+20的坐标上的点颜色为0x00ff00
-- 3. 其X坐标-10,Y坐标-20的坐标上的点颜色为0xff0000
x, y = screen.findColor({0x0000ff, 10, 20, 0x00ff00, -10, -20, 0xff0000}, 90, 10, 10, 200, 200);
if x ~= -1 and y ~= -1 then -- 如果找到了
touch.down(0, x, y); -- 点击那个点
touch.up(0);
end
注意事项:
1,数组内的坐标为第一个坐标的相对值。
2,多点找色代码和数组可以通过触摸精灵脚本编辑器的找色模板生成。
3,精确度设置的越低就会增大误判的可能性,建议设置60~90之间。
4,善用此函数可完全替代找图,并提高脚本效率。
多点区域模糊找色返回所有坐标示例
function main()
t = screen.findColor({0xEB78E6, 1, 0, 0xF09CE9, 2, 4, 0x6C1771, 2, 6, 0x4B1956},80,100, 100, 500, 500, true)
sys.log(t)
end
返回的 table 格式:
table = { {
x = 394,
y = 397
}, {
x = 488,
y = 404
}, {
x = 488,
y = 713
} }
函数:screen.findImage() 找图
原函数名 : findImage, findImageFuzzy, findImageInRegion, findImageInRegionFuzzy
函数说明 : 寻找符合指定图案,返回左上角坐标。
函数方法 : screen.findImage(图像路径 path, 精度 fuzzy?, 左上角坐标x?, 左上角坐标y?, 右下角坐标x?, 右下角坐标y?, 透明色trans?);
返回值 : 整数型 x, y
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
path | string | 要找的图片的路径 | 必填 |
fuzzy | number | 精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配 | 非必填,默认100 |
ltx | number | 欲寻找的区域左上角的X坐标 | 非必填,默认全屏 |
lty | number | 欲寻找的区域左上角的Y坐标 | 非必填,默认全屏 |
rbx | number | 欲寻找的区域右下角的X坐标 | 非必填,默认全屏 |
rby | number | 欲寻找的区域右下角的Y坐标 | 非必填,默认全屏 |
trans | number | 指定图片中透明颜色 | 非必填 |
返回值 | 类型 | 说明 |
---|---|---|
x | number | 找到的坐标X值,未找到返回 -1 |
y | number | 找到的坐标Y值,未找到返回 -1 |
全屏找图示例
x, y = screen.findImage("/var/touchelf/a.png");
-- 在全屏范围找到第一个路径为"/var/touchelf/a.png"的图片, 将其左上角坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then -- 如果找到了
touch.down(0, x, y); -- 点击那个点
touch.up(0);
end
全屏模糊找图示例
x, y = screen.findImage("/var/touchelf/a.png", 90);
-- 在全屏范围找到第一个路径为"/var/touchelf/a.png"的图片, 精确度为90, 将其左上角坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then -- 如果找到了
touch.down(0, x, y); -- 点击那个点
touch.up(0);
end
区域模糊找图示例
x, y = screen.findImage("/var/touchelf/a.png", 90, 100, 100, 200, 200, 0x000000);
-- 在区域[(100,100)(200,200)]范围找到第一个路径为"/var/touchelf/a.png"的图片, 精确度为90, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then
touch.down(0, x, y); -- 点击那个点
touch.up(0);
end
教程:透明找图时图片的处理
在找图时,如果需要忽略掉一部分会变动的背景,这时候可以使用透明找图,将要找的图片中不参与比较的颜色填充成一个固定的颜色,然后在找图时指定该颜色为透明色,这样在找图时,即使那部分画面变了,也一样可以找到图片。
如下图是原图,除文字以外的部分背景是变化的,用其他找图时会因为变化的背景导致图片找不到:
那么可以将图片处理成下图这样,然后在找图时指定黑色(0x000000)为透明色,那么就算是背景变化,也可以找到了。
注意事项:
1,全屏找图耗费资源,速度慢,不推荐使用.
2,图片支持PNG,JPG,BMP格式,建议使用PNG格式.
函数:screen.snapshot() 截图
原函数名 : snapshotScreen, snapshotRegion
函数说明 : 截取屏幕中指定区域的图像并生成指定格式的图片文件。
函数方法 : screen.snapshot(图像路径 path, 左上角坐标x?, 左上角坐标y?, 右下角坐标x?, 右下角坐标y?, 缩放比例 scale?);
返回值 : 无
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
path | string | 保存截图的路径 | 必填 |
ltx | number | 截图区域左上角的X坐标 | 非必填,默认全屏 |
lty | number | 截图区域左上角的Y坐标 | 非必填,默认全屏 |
rbx | number | 截图区域右下角的X坐标 | 非必填,默认全屏 |
rby | number | 截图区域右下角的Y坐标 | 非必填,默认全屏 |
scale | number | 图片尺寸缩放百分比 | 非必填,默认为100 |
示例
-- 将全屏截图保存到路径为/var/touchelf/a.jpg的图片中, 格式为PNG
screen.snapshot("/var/touchelf/a.png");
-- 将区域[(100,100)(200,200)]的截图保存到路径为/var/touchelf/a.jpg的图片中, 格式为JPG
screen.snapshot("/var/touchelf/a.jpg", 100, 100, 200, 200);
-- 将区域[(100,100)(200,200)]的截图保存到路径为/var/touchelf/a.png的图片中, 格式为PNG, 并且尺寸缩小为原始尺寸的50%
screen.snapshot("/var/touchelf/a.png", 100, 100, 200, 200, 50);
-- 将区域[(100,100)(200,200)]的截图保存到路径为/var/touchelf/a.png的图片中, 格式为PNG, 并且尺寸缩小为原始尺寸的200%
screen.snapshot("/var/touchelf/a.png", 100, 100, 200, 200, 200);
-- 以时间戳命名进行截图,防止截图重名被覆盖
screen.snapshot(string.format( "/var/touchelf/%s.png",os.time()), 100, 100, 200, 200);
注意事项:
1,图片路径请填写绝对路径。
2,保存图片的格式可为PNG,JPG,BMP,建议使用PNG。
3,os.time()为 Lua 操作系统库函数。string.format()为String库函数。