新的數(shù)值類型:int 和 uint
在以前的 ActionScript 版本中,只有一種數(shù)值類型 Number,它可以表示正整數(shù),負整數(shù)或是浮點數(shù)(或0)。我們已經(jīng)習慣了這種自由的用法,但是現(xiàn)在多增加的兩種數(shù)值類型可以讓我們的代碼更加清晰。
第一個新增加的數(shù)值類型是 int(整型),這個類型可以為正整數(shù)或負整數(shù)或零。如果我們把一個浮點數(shù)值聲明為 int 類型的話,小數(shù)部分會自動被去掉。比如,把 1.9 聲明為 int,結果為 1。因此,當我們確定只使用整數(shù)時,就把變量聲明為 int ,在循環(huán)中用于計數(shù)的變量一般應該是 int 。下面這段代碼中,i變量永遠不會得到浮點數(shù)值,這時使用int類型就有了意義。
for(var i:int = 0; i < 100; i++) { // do something in here! }
第二個新的類型是 uint(無符號整型),“無符號”意思是沒有正負(+-)號,永遠為正數(shù)。32位顏色值在 AS 3 中總是以 uint 類型存儲,這是因為無符號整型比(有符號)整型能夠保留更多的數(shù)值。 Int 和 uint 都可以存儲32位數(shù),這個數(shù)值大于40億,但是 int 有一個特殊位用于存儲符號(+-),所以只有31位數(shù)(大于20億),這樣就可以標記正數(shù)或負數(shù)了。所以,使用int 類型聲明一個正的32位色彩值就顯得太大了!如果用了又會怎樣?讓我們來試試:
var color1:int = 0xffffffff; trace(color1); var color2:uint = 0xffffffff; trace(color2);
0xFFFFFFFF 的值相當于十進制的 4,294,967,295,因為這個值對于 int 來說太大了,所以結果被“反轉(zhuǎn)”了過來變成了 -1!當然這不是我們所期望的結果。如果使用 uint 類型的話,就沒問題了。因此,由于色彩值永遠都是正數(shù),并有可能超出 int 的值域范圍,所以要使用 uint 來存儲它們。
色彩合成
如何將紅、綠、藍三種顏色值組成一個有效的顏色值,這是個普遍的問題。假設有三個變量 red,green,blue,每個變量里面保存一個0到255之間的數(shù)。下面是這個公式: 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位二進制數(shù)等于256。
在色彩合成公式中,第一個位操作符是 << ,是一個按位左移操作符,該操作是將二進制數(shù)值向左側(cè)移動。比如,紅色值(red)為0xFF或255,可以由二進制表示為: 11111111 將它向左移動16位,結果是: 111111110000000000000000
在24位色彩中,它表示紅色,轉(zhuǎn)換為二進制后為 0xFF0000,是純紅色。 下面,假設有一個綠色值(green)為 0x55(十進制85),二進制表示為: 01010101 將它向左移動8位后,結果為: 000000000101010100000000
這樣一來,這8位數(shù)完全移動到了綠色值的范圍。
最后,假設一個藍色值為0xF3(十進制243),二進制表示為:11110011。因為它們都處在藍色(blue)的范圍,所以不需要再去移動它。這樣我們總共就擁有了三組數(shù): 111111110000000000000000 000000000101010100000000 000000000000000011110011
可以簡單地將它們加起來,成為一個24位數(shù),但是,還有一種更好更快的方法:使用或(OR)運算,符號是 | 。它會將兩組數(shù)的每個二進制位進行比較,如果兩個之中有一個數(shù)為1,那么結果就為1,如果兩個數(shù)都為0,那么結果就為0?梢允褂没(OR)運算將 red,green,blue 的值相加起來,也可以這么說“如果這個數(shù)或這個數(shù)或這個數(shù)中有一個數(shù)等于1,那么結果就為1”。最終結果為: 111111110101010111110011 將這個數(shù)轉(zhuǎn)換為十六進制就等于 0xFF55F3 。當然,我們無法看到這些二進制位,也不會與這些0或1打交道,只需要學會這種寫法: var color24:Number = 0xFF << 16 | 0x55 << 8 | 0xF3; 十進制寫法是: var color24:Number = 255 << 16 | 85 << 8 | 243; Flash 并不關心人們使用的是十進制數(shù)還是十六進制數(shù)。
同樣,還可以將 red,green,blue 的值全部轉(zhuǎn)換為十六進制的字符串,然后將它們連接成一條很長的字符串,最后再把它們轉(zhuǎn)換為十六進制數(shù)。但是,如果這樣做的話會很麻煩,而且使用字符串操作會非常慢。相反,使用二進制操作是 ActionScript 中最快的運算,因為它們屬于低級運算。
對于32位數(shù),其實道理也是一樣的,加入8位 alpha(透明度)通道并將其向左移24位。例如,有一組32位數(shù)為0xFFFF55F3,將 alpha 值向左移動24位,結果如下: 11111111111111110101010111110011 前8位數(shù)表示透明度,后面的 red,green,blue 值與前面的一樣。
出處:藍色理想
責任編輯:bluehearts
上一頁 渲染技術 [1] 下一頁 渲染技術 [3]
◎進入論壇RIA設計與應用版塊參加討論
|