Making Things Move 第四章 (2)

创建日期:2008年5月18日 来自:蓝色理想 浏览:197次 作者:alan98

新的数值类型: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 中最快的运算,因为它们属于低级运算。


责编:yezi
相关搜索: Making   Things   Move  
Google
嗷嗷毙技术网版权申明:大家可以自由转载我站点的文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来链接,自行链接)。文章版权归作者所有。
特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。
子栏目
搜索 
Google