color颜色库

 

一、创建颜色对象

颜色对象是一个userdata类型的变量,可以使用下面的函数来创建新的颜色对象。

cl = color.new()
cl = color();

创建空的颜色对象

因为color.new 是color库的默认函数,color()等效于color.new();

cl = color.new(num)
cl = color(num)
用颜色的数字值作为参数,创建新的颜色对象。

cl = color.new(255,255,255)
cl = color(255,255,255)
从RGB值创建新的颜色对象。

RGB颜色模式通过红(R)、绿(G)、蓝(B)三种基色分量的不同值混合来表示不同的颜色。
每个基色的可选值为0到255(也就是一个字节),一个完整的RGB颜色值为三个字节.

cl = color.new("#FFFFFF")
cl = color("#FFFFFF")
用颜色的字符串值作为参数,创建新的颜色对象。

在模拟精灵中,颜色的字符串值与网页上通用的颜色表示方法相同,即#RRGGBB
第1、2位以16进制数表示红色,第3、4位以16进制数表示绿色,第5、6位以16进制数表示蓝色

cl = color.new(x,y)
cl = color(x,y)
屏幕抓点函数,抓取屏幕坐标x,y位置的像素点颜色并创建新的颜色对象。

cl2 = color.new(cl)
cl2 = color(cl)
拷贝新的颜色对象。

userdata、table、function这三种数据类型在赋值时仅添加一个新的引用而不是拷贝新的对象。
cl2 = cl这样两个变量是指向同一个对象,而 cl2 = color.new(cl) 是拷贝一个新的对象。

二、释放颜色对象

color.del(cl)
立即释放cl对象。并不会删除cl这个变量(cl指向无效的对象)。

cl = nil;
立即删除cl变量,等待垃圾收集释放cl引用的颜色对象。

三、修改颜色值

color.fromPos(cl ,x, y )
cl:fromPos( x, y )
重新抓点并修改cl的颜色值。

cl:fromPos( x, y ) 等效于 color.fromPos(cl ,x, y )
对象名后面使用冒号":"代替圆点"."作为函数成员符使用时,会自动添加一个self参数表示对象自身。

color.setNumber(cl , num )
cl:setNumber( num )
通过颜色的数字值设置颜色值。

color.setString(cl , "#FFAABB")
cl:setString( "#FFAABB")
通过颜色的字符串表达式设置颜色值。

color.setRGB(cl ,r,g,b )
cl:setRGB(r,g,b )
通过颜色的RGB值设置颜色值。

color.setHSL(cl,h ,s ,l )
cl:setHSL(h ,s ,l )
通过颜色的HSL值设置颜色值。

HSL颜色模式是通过色调(h),饱和度(s),亮度(l)的不同值表示不同的颜色.
HSL模型更容易被人理解和控制,因为人眼通过颜色的亮度、色调以及饱和度区分物体
有时候,我们在分析颜色的时候可能需要忽略亮度等因素,这时候读取HSL就有用了。

四、读取颜色值

num = color.getNumber(cl)
num = cl:getNumber()
num是一个返回的数字值。

str = color.getString(cl)
str = cl:getString()
str是一个返回的字符串值。

r,g,b =color.getRGB(cl)
r,g,b = cl:getRGB()
r,g,b是返回的RGB值。

h,s,l = color.getHSL(cl)
h,s,l = cl:getHSL()
h,s,l是返回的HSL值。分别为色调(h),饱和度(s),亮度(l)。

五、调整颜色位数

color.bpp(cl,bit)
cl:bpp(bit)

bit 可指定以下值 1(黑白) 4(16色) 8(256色) 24(真彩色)

cl = color("#FFA3FF");
cl:bpp(8);

使用上面的方法,可以方便的比较近似颜色。

注意

取颜色数字值直接加减比较的方法并不科学,应当通过bpp函数求近似色然后比较.或者取RGB、HSL值进行分析。

六、设置屏幕颜色

color.toPos(cl,x ,y )
cl:toPos( x,y )
将颜色输出到屏幕坐标x,y。

示例:

cl = color("#FF0000"); --创建一个新的颜色对象(红色)
for i=1,100,1 do --递增循环100次
   cl:toPos( i,i ); --在屏幕上画红色的点
end;

--最终的效果在屏幕上输出一个红色的线条。

七、运算符

1、颜色对象可以使用等于、不等于操作符进行比较。

例:

win.consoleOpen();

cl = color(32);
cl2 = color("#32FACE");

--color对象可使用比较运算符比较颜色值
print("cl == cl2 ",cl == cl2);
print("cl ~= cl2 ",cl ~= cl2);


2、 颜色对象可以直接参于四则运算。

color对象可自动转换为数字参与四则运算,例:

win.consoleOpen();

cl = color(32);
cl2 = color("#32FACE");

print("cl + cl2 = ",cl + cl2);
print("cl - 2 = ",cl - 2);
print("3 * cl = ",3 * cl);
print("cl / 3 = ",cl / 3);

3、color对象可以转换为字符串

win.consoleOpen();
cl = color(32);

print( tostring(cl) ); --可以通过tostring函数转换为字符串
print( cl ); --print能自动调用 tostring(cl)
print( cl.."这是字符串" ); --与字符串连接时自动转换为字符串

八、屏幕抓点

使用LAScript脚本虽然也可以在屏幕上抓点,
但是推荐大家使用「fap模拟程序」中「模拟区块」中提供的自动抓点功能,更强大,也更好用。
另外,使用image库的函数抓屏然后再抓点也是不错的方法。

下面是使用LAScript脚本抓点的一个例子。

-- 一句代码实现抓点判断
if (color(2,2) == color("#FA12B3") ) then
    win.messageBox("很好,坐标2*2处的颜色是#FA12B3","抓点")
else
    win.messageBox("抱歉,坐标2*2处的颜色不是#FA12B3","抓点")
end;

九、在屏幕上查找颜色

color.find(cl,x,y,x2,y2)
cl:find(x,y,x2,y2)

x,y,x2,y2指定查找范围,cl是一个color对象。

cl = color(16777215);
x,y =cl:find(0,0,1024,768);
 
win.consoleOpen()
print("找到颜色16777215在:",x,y);