


先来了解一下魔兽世界中颜色的设定,它采用的是Hex的表示法,这个在网上还不好找,一般都是RGB色谱,先来转换一下吧,要不然你想要那种颜色,也是傻傻分不清。
Hex 怎么转 RGB呢?
例如,FFCC99,,每两个字符代表一个0-255的16进制数,分别表示红,绿,蓝三种颜色。我们可以利用string.sub()函数将其分为3部分,然后用tonumber()将字符串转换为数字,不过注意:
hexRed=string.sub("FFCC99", 1, 2)
print(tonumber(hexRed))

结果是nil,因为lua语言中,tonumber() 默认用于转换10进制数字。需要第二个参数以指定数制:
hexRed=string.sub("FFCC99", 1, 2)
print(tonumber(hexRed, 16)) 结果是:255
然后就可以写出16进制转换RGB百分比的代码了,用一个函数来表达吧,用起来方便些:
function Convert_Hex2RGB(hex)
local red = string.sub(hex, 1, 2)
local green = string.sub(hex, 3, 4)
local blue = string.sub(hex, 5, 6)
red = tonumber(red, 16)/255
green = tonumber(green, 16)/255
blue = tonumber(blue, 16)/255
return red, green, blue
end 简单测试一下,在vscode中还是比较直观的,直接可以显示出来颜色:
纯蓝色:用RGB原理表示为:[R:0,G:0,B,255],对应十六进制颜色码就是#0000FF
纯红色:RGB颜色值 [R:255,G:0,B,0] 颜色码:#FF0000
纯绿色:RGB颜色值 [R:0,G:255,B,0] 颜色码:#00FF00
沙黄色:RGB颜色值 [R:255,G:204,B,153] 颜色码:#FFCC99
纯白色:RGB颜色值 [R:255,G:255,B,255] 颜色码:#FFFFFF
纯黑色:RGB颜色值 [R:0,G:0,B,0] 颜色码:#000000
print(Convert_Hex2RGB("0000FF"))
print(Convert_Hex2RGB("FF0000"))
print(Convert_Hex2RGB("00FF00"))
print(Convert_Hex2RGB("FFCC99"))
print(Convert_Hex2RGB("FFFFFF"))
print(Convert_Hex2RGB("000000"))
输出的结果是:
0,0,1
1,0,0
0,1,0
1,0.8,0.6
1,1,1,
0,0,0 颜色搞清楚了,就可以给窗体添加纹理了:

在XML中,说过都是成对出现的表示法,<Texture></Texture>也不例外:
&lt;!-- 材质设置 --&gt;
&lt;Texture name=&quot;$parentTexture&quot;&gt;
&lt;Size x=&quot;198&quot; y=&quot;198&quot; /&gt;
&lt;Anchors&gt;
&lt;Anchor point=&quot;TOP&quot; relativePoint=&quot;TOP&quot; /&gt;
&lt;/Anchors&gt;
&lt;!-- 也是一样,前三位是颜色,后一位是透明度 --&gt;
&lt;Color r=&quot;0&quot; g=&quot;0&quot; b=&quot;1&quot; a=&quot;0.3&quot; /&gt;
&lt;/Texture&gt; 纹理还可以是两种不同颜色间的渐变。这可以使用<Gradient>标记来设定最小颜色和最大颜色,并以此定义一个渐变效果。
<Gradient>有orientation属性,可以赋值为HORIZONTAL(垂直渐变)或VERTICAL(水平渐变)。默认是ORIZONTAL。标记必须包含两个元素,<MinColor>和<MaxColor>,均为ColorType类型。
仅一个<Gradient>标记并不会创建渐变效果,它必须与<Color>标记结合使用才可以。在渐变效果的每个位置,从Color>标记得到的颜色值与当前的渐变值相乘,来决定屏幕上应当显示什么样的颜色。这样处理最简单的实现方法是具有下面的颜色值。
&lt;Color r=”1.0” g=”1.0” b=”1.0” a=”1.0” /&gt;

这保证了你的渐变值从<MinColor>开始,到<MaxColor>结束,由于每个分量值都为1.0,因此其在相乘时并不改变每个颜色值。
&lt;!--$parent是一个通配符,它表示如果在Lua中要引用这个对象,需要加上它的父对象的名称,比如这里的名称就是Lesson_three_FrameTexture--&gt;
&lt;Texture name=&quot;$parentTexture&quot;&gt;
&lt;Size x=&quot;200&quot; y=&quot;100&quot; /&gt;
&lt;Anchors&gt;
&lt;Anchor point=&quot;TOPLEFT&quot; relativePoint=&quot;TOPLEFT&quot; /&gt;
&lt;/Anchors&gt;
&lt;Color r=&quot;1.0&quot; g=&quot;0.0&quot; b=&quot;0.0&quot; a=&quot;1.0&quot; /&gt;
&lt;Gradient orientation=&quot;HORIZONTAL&quot;&gt;
&lt;MinColor r=&quot;1.0&quot; g=&quot;0.0&quot; b=&quot;0.0&quot; a=&quot;1.0&quot; /&gt;
&lt;MaxColor r=&quot;0.0&quot; g=&quot;0.0&quot; b=&quot;0.0&quot; a=&quot;1.0&quot; /&gt;
&lt;/Gradient&gt;
&lt;/Texture&gt;
&lt;Texture name=&quot;$parentVertical&quot;&gt;
&lt;Size x=&quot;200&quot; y=&quot;100&quot; /&gt;
&lt;Anchors&gt;
&lt;Anchor point=&quot;BOTTOMLEFT&quot; relativePoint=&quot;BOTTOMLEFT&quot; /&gt;
&lt;/Anchors&gt;
&lt;Color r=&quot;1.0&quot; g=&quot;1.0&quot; b=&quot;1.0&quot; a=&quot;1.0&quot; /&gt;
&lt;Gradient orientation=&quot;VERTICAL&quot;&gt;
&lt;MinColor r=&quot;0.0&quot; g=&quot;0.0&quot; b=&quot;0.0&quot; a=&quot;1.0&quot; /&gt;
&lt;MaxColor r=&quot;1.0&quot; g=&quot;1.0&quot; b=&quot;0.0&quot; a=&quot;1.0&quot;/&gt;
&lt;/Gradient&gt;
虽然这个花里胡哨的,也不一定用到,但是颜色表示法还是需要了解的,因为在插件中,我们会用颜色来区分不同的状态,窗体的设定是Hex模式,其实在lua中实现的时候,都是用的RGB颜色,所以也不用担心。