**:
看到標題也許非常多數學不好或中學時上課打盹的朋友會感到反感,但放心的是在這裡的matrix已簡化了非常多瑣碎的步驟,也不用大家拿一張紙拼命的做計算。對想製作遊戲的朋友也是必學的路程,所以大致上明白了運用的思路就能說掌控了技巧。
在字典中的說明不夠充分讓大家去理解,所以開始還是要重複說明一下。matrix矩陣就像個陣列,排列方式是以列和行組成。在flash 8中所提供的是3 x 3矩陣,3x3的矩陣能定義出乙個3d計算,但在flash 8中只供2d的計算,即 x 和 y 的計算,那麼我們來看看這個矩陣的定義
以上的每個字母都有各自的運用意義,分別是:
a = 控制 x 的寬度
b = 控制 y 的傾斜
c = 控制 x 的傾斜
d = 控制 y 的高度
tx = 控制 x 座標位置
ty = 控制 y 座標位置
接下來就是怎麼在matrix函式中定義,其實非常簡單。首先匯入 matrix 的封包,然後就能開始定義
import flash.geom.matrix; //匯入類包
var mymatrix:matrix = new matrix(a, b, c, d, tx, ty); //開始定義matrix類
當中的a, b, c, d, tx, ty能直接定義。再來我們把這段引入例子,以證實及幫助了解以上各個引數的運用。
步驟1:在場景上建立乙個mc,即畫個方形後按f8選擇movieclip(影片),定義例項名為mc
步驟2:到場景第一幀開始我們的**
matrix 必須配合 transform 才能實現出所定義的效果,不多說了開始看看**吧
import flash.geom.matrix; //匯入matrix 類包
import flash.geom.transform; //到入transform類包
var mymatrix:matrix = new matrix(1,0,0,1,100,100); //引數定義為寬度比例為1,無所有的傾斜,高度比例1,xy座標為100
var mytransform:transform = new transform(mc); //transform物件為場景上的mc
mytransform.matrix = mymatrix; //賦予transform的matrix函式為我們所定的mymatrix類
那麼接下來測試就能看到結果了,看不出什麼效果??那麼我來換換matrix的引數值成
var mymatrix:matrix = new matrix(1,1,0,1,100,100); //第二引數改為1
這樣測試是不是就看到我們的b影響了mc的形狀呢??matrix的運用就是這樣,非常簡單吧??所以非常多東西不要以為非常困難,其實都非常簡單。
再來我們要深入一點,去了解matrix的計算,知其一不知其二也是無法正確掌控好運用的。matrix的計算其實非常簡單,就只有兩行的公式:
x』 = a*x + c*y + tx;
y』 = b*x + d*y + ty;
意思就是
新座標x = a * 現有x座標 + c * 現有y座標 + 常量tx;
新座標y =b * 現有x座標 +d * 現有y座標 + 常量ty;
我們把這個例子代入公式中
a = 2, b = 0, c = 0, d = 1, tx = 0, ty = 0
x』 = 2x + 0y + 0;
y』 = 0x + 1y + 0;
x』 = 2x;
y』 = y;
能知道下乙個新的x值會是目前x的兩倍,而y保持不變,在一開始已說了a的變化會影響寬度,那麼出來的形狀就是寬度為現有的兩倍了。
在matrix中更有幾個基本函式能控制,所以也能不用一直重新定義matrix類,那就是
matrix.scale(a,d);
matrix.translate(tx1, ty2); //這裡的tx1和ty1是所要遞增或遞減原有tx和ty的數值
matrix.rotate(弧度); //弧度就是 (角度/ 180)* math.pi
基本上只要代入公式就能得到答案,所以我只說明rotate函式的計算
math.rotate((50/180)*math.pi) //這裡是需求旋轉 50 度
公式為:
x』 = cos(a)*x + sin(c)*y + tx;
y』 = -sin(b)*x + cos(d)*y + ty;
x』 = cos(50)*x + sin(50)*y + tx;
y』 = -sin(50)*x + cos(50)*y + ty;
x』 = 0.64*x + 0.76*y + tx;
y』 = -0.76*x + 0.64*y + ty;
得到的這個答案再把現有座標x和y代入就能求出新座標了
那麼我們來驗證a,b,c,d的數值是否正確吧,開啟乙個新的場景,在幀上輸入
import flash.geom.matrix;
var mymatrix:matrix = new matrix();
mymatrix.rotate((50/180)*math.pi);
trace(mymatrix.tostring()); //看看當中的a,b,c,d是不是也是這個數值呢?
好啦。。到了最後的部分也就能完結這篇教程了,最重要的一點也是非常多人百思不解的問題是:
求出乙個x和y,為何會能夠讓元件轉動呢?這只是個座標啊??最多也只是控制座標點,怎麼那麼神奇??
這點就是flash提供的方便了,其實為何需要配合transform的關鍵就是在此,transform指定了元件之後會得到4個角的座標。所以我們使用transform.matrix函式就是讓transform把matrix的公式代入每個角的座標。
所以公式中的x和y就是每個角的座標,座標代入公式就直接取得了新的座標值而達到旋轉變形等的功能。這是不是簡單化了非常多呢??總比在之前版本還要自己定義函式。
as3中的容器
4種容器 array object vector dictionary 各自特點 array是索引陣列,雖然它也是動態類,可以等同於object來用,但是不建議這樣,因為沒有任何好處。除了鍵上的區別外,array還是善於隨機訪問的,但不知道object和dictionary和它在訪問速度上的區別有多...
as3中bitmapData中draw方法重新理解
flash.display.bitmapdata.draw source ibitmapdrawable,matrix matrix null,colortransform colortransform null,blendmode string null,cliprect rectangle nu...
AS3中XML刪除節點
e4x規範中定義有delete和deletebyindex方法用來刪除特定的xml節點,但是在當前版本的actionscript 3.0實現中,並沒有實現這兩個方法。在as3的help文件裡也沒有提及如何刪除乙個xml節點。其中乙個方法就是 delete onexmlnode 暫時並不知道有什麼其他...