新的数值类型:int 和 uint
在以前的 ActionScript 版本中,只有一种数值类型 Number,它可以表示正整数,负整数或是浮点数(或0)。我们已经习惯了这种自由的用法,但是现在多增加的两种数值类型可以让我们的代码更加清晰。
第一个新增加的数值类型是 int(整型),这个类型可以为正整数或负整数或零。如果我们把一个浮点数值声明为 int 类型的话,小数部分会自动被去掉。比如,把 1.9 声明为 int,结果为 1。因此,当我们确定只使用整数时,就把变量声明为 int ,在循环中用于计数的变量一般应该是 int 。下面这段代码中,i变量永远不会得到浮点数值,这时使用int类型就有了意义。
for(var i:int = 0; i < 100; i++) { // do something in here! }
第二个新的类型是 uint(无符号整型),“无符号”意思是没有正负(+-)号,永远为正数。32位颜色值在 AS 3 中总是以 uint 类型存储,这是因为无符号整型比(有符号)整型能够保留更多的数值。 Int 和 uint 都可以存储32位数,这个数值大于40亿,但是 int 有一个特殊位用于存储符号(+-),所以只有31位数(大于20亿),这样就可以标记正数或负数了。所以,使用int 类型声明一个正的32位色彩值就显得太大了!如果用了又会怎样?让我们来试试:
var color1:int = 0xffffffff; trace(color1); var color2:uint = 0xffffffff; trace(color2);
0xFFFFFFFF 的值相当于十进制的 4,294,967,295,因为这个值对于 int 来说太大了,所以结果被“反转”了过来变成了 -1!当然这不是我们所期望的结果。如果使用 uint 类型的话,就没问题了。因此,由于色彩值永远都是正数,并有可能超出 int 的值域范围,所以要使用 uint 来存储它们。
色彩合成
如何将红、绿、蓝三种颜色值组成一个有效的颜色值,这是个普遍的问题。假设有三个变量 red,green,blue,每个变量里面保存一个0到255之间的数。下面是这个公式: color24 = red<<16 | green<<8 | blue; 加入透明度后,建立一个32位色彩值,公式如下: color32 = alpha << 24 | red << 16 | green << 8 | blue;
这里用到了两个位操作符,大家以前可能没有接触过。位操作是对二进制(0或1)进行的操作,对于24位色来说,如果把颜色值的每一位都列出来,就会得到一串由24个0或1组成的字串。把十六进制 0xRRGGBB 分解成二进制后是这样的:RRRRRRRRGGGGGGGGBBBBBBBB,我们看到有8位red,8位green,8位blue,也就是说8位二进制数等于256。
在色彩合成公式中,第一个位操作符是 << ,是一个按位左移操作符,该操作是将二进制数值向左侧移动。比如,红色值(red)为0xFF或255,可以由二进制表示为: 11111111 将它向左移动16位,结果是: 111111110000000000000000
在24位色彩中,它表示红色,转换为二进制后为 0xFF0000,是纯红色。 下面,假设有一个绿色值(green)为 0x55(十进制85),二进制表示为: 01010101 将它向左移动8位后,结果为: 000000000101010100000000
这样一来,这8位数完全移动到了绿色值的范围。
最后,假设一个蓝色值为0xF3(十进制243),二进制表示为:11110011。因为它们都处在蓝色(blue)的范围,所以不需要再去移动它。这样我们总共就拥有了三组数: 111111110000000000000000 000000000101010100000000 000000000000000011110011
可以简单地将它们加起来,成为一个24位数,但是,还有一种更好更快的方法:使用或(OR)运算,符号是 | 。它会将两组数的每个二进制位进行比较,如果两个之中有一个数为1,那么结果就为1,如果两个数都为0,那么结果就为0。可以使用或(OR)运算将 red,green,blue 的值相加起来,也可以这么说“如果这个数或这个数或这个数中有一个数等于1,那么结果就为1”。最终结果为: 111111110101010111110011 将这个数转换为十六进制就等于 0xFF55F3 。当然,我们无法看到这些二进制位,也不会与这些0或1打交道,只需要学会这种写法: var color24:Number = 0xFF << 16 | 0x55 << 8 | 0xF3; 十进制写法是: var color24:Number = 255 << 16 | 85 << 8 | 243; Flash 并不关心人们使用的是十进制数还是十六进制数。
同样,还可以将 red,green,blue 的值全部转换为十六进制的字符串,然后将它们连接成一条很长的字符串,最后再把它们转换为十六进制数。但是,如果这样做的话会很麻烦,而且使用字符串操作会非常慢。相反,使用二进制操作是 ActionScript 中最快的运算,因为它们属于低级运算。
对于32位数,其实道理也是一样的,加入8位 alpha(透明度)通道并将其向左移24位。例如,有一组32位数为0xFFFF55F3,将 alpha 值向左移动24位,结果如下: 11111111111111110101010111110011 前8位数表示透明度,后面的 red,green,blue 值与前面的一样。
出处:蓝色理想
责任编辑:bluehearts
上一页 渲染技术 [1] 下一页 渲染技术 [3]
◎进入论坛RIA设计与应用版块参加讨论
|