屏幕模块

函数:screen.resolution() 屏幕分辨率

原函数名 : getScreenResolution
函数说明 : 获取当前屏幕分辨率。
函数方法 : screen.resolution();
返回值 : 整数型 width,height

返回值类型说明
widthnumber获取到的当前屏幕宽度
heightnumber获取到的当前屏幕高度

示例

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

返回值类型说明
colornumber色彩位数

示例

color = screen.colorBits();                -- 将屏幕色彩位数保存在变量color中
sys.dialog(string.format("%d\n", color)); -- 将色彩位数用提示框显示到屏幕上

函数:screen.keep() 屏幕保持

原函数名 : keepScreen
函数说明 : 开启/关闭屏幕保持(缓存屏幕数据)。
函数方法 : screen.keep(是否保持 on, 二值化颜色数组 colors?, 二值化精度 fuzzy?);
返回值 : 无

参数类型说明必填
onboolean开启/关闭屏幕保持必填
colorsnumber 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);
返回值 : 无

参数类型说明
degnumber旋转角度
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

参数类型说明
number将获取颜色值的X坐标
number将获取颜色值的y坐标
返回值类型说明
colornumberx,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

参数类型说明
number将获取颜色值的X坐标
number将获取颜色值的Y坐标
返回值类型说明
Rnumberx,y坐标点的颜色R(红色)值
Gnumberx,y坐标点的颜色G(绿色)值
Bnumberx,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

参数类型说明必填
colorstable要找的颜色数组必填
fuzzynumber精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配非必填,默认100
ltxnumber欲寻找的区域左上角的X坐标非必填,默认全屏
ltynumber欲寻找的区域左上角的Y坐标非必填,默认全屏
rbxnumber欲寻找的区域右下角的X坐标非必填,默认全屏
rbynumber欲寻找的区域右下角的Y坐标非必填,默认全屏
allboolean是否返回所有符合条件的坐标非必填,默认返回第一个坐标
返回值类型说明
x整数型找到的坐标X值,未找到返回 -1
y整数型找到的坐标Y值,未找到返回 -1
all为true的返回值类型说明
tabletable范围内找到的坐标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

参数类型说明必填
pathstring要找的图片的路径必填
fuzzynumber精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配非必填,默认100
ltxnumber欲寻找的区域左上角的X坐标非必填,默认全屏
ltynumber欲寻找的区域左上角的Y坐标非必填,默认全屏
rbxnumber欲寻找的区域右下角的X坐标非必填,默认全屏
rbynumber欲寻找的区域右下角的Y坐标非必填,默认全屏
transnumber指定图片中透明颜色非必填
返回值类型说明
xnumber找到的坐标X值,未找到返回 -1
ynumber找到的坐标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?);
返回值 : 无

参数类型说明必填
pathstring保存截图的路径必填
ltxnumber截图区域左上角的X坐标非必填,默认全屏
ltynumber截图区域左上角的Y坐标非必填,默认全屏
rbxnumber截图区域右下角的X坐标非必填,默认全屏
rbynumber截图区域右下角的Y坐标非必填,默认全屏
scalenumber图片尺寸缩放百分比非必填,默认为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库函数。