as3中matrix 解釋,終於找到了

2021-08-30 21:01:42 字數 2903 閱讀 8866

**:

看到標題也許非常多數學不好或中學時上課打盹的朋友會感到反感,但放心的是在這裡的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 暫時並不知道有什麼其他...