2012-03-22 82 views
1

我們希望擴展移動功能,旋轉和閃光燈AS3拖動功能。 我確實有一些代碼。它的旋轉功能運作良好。但是,我們旋轉圖像後,縮放功能不起作用。旋轉,縮放和使用AS3

我們旋轉,並通過一個參考點變焦圖像。

這裏是代碼:

function scaleRotateFromPoint(sx:Number, sy:Number, ptCenter:Point, angle:Number):void{ 
    var mat:Matrix = imgMat.clone(); 
    mat.tx -= ptCenter.x; 
    mat.ty -= ptCenter.y; 
    mat.rotate (angle*(Math.PI/180)); 
    mat.scale(sx,sx); 
    mat.tx += ptCenter.x; 
    mat.ty += ptCenter.y; 
    loaderFirst.transform.matrix = mat; 
} 

我們需要傳遞一個點,變焦值和旋轉角度。

在此先感謝。

+0

當您說「我們旋轉圖像後,縮放功能不起作用」時,您的意思是否定更長時間有什麼影響?或者它不能正常工作?請更多信息! – aaaidan 2012-03-22 21:11:03

+0

@aaaidan,它不能正常工作。它具有縮放效果,但不會從給定點縮放。 :( – Ronak 2012-03-23 04:11:45

+0

好吧,那麼代碼的一般形狀對我來說似乎是合理的,這讓我想知道它在函數本身中是不是問題?您是否想要從「imgMat」克隆矩陣並將其分配給加載器的矩陣? ,你不應該通過(sx,sy)來縮放嗎? – aaaidan 2012-03-25 02:26:25

回答

0

我剛剛在Flash中使用了你的函數,並且它對我來說似乎很適合。

我更改了代碼,以便將變換對象作爲參數,並在修改後設置修改後的矩陣以確保正確使用它。

function scaleRotateFromPoint(t:Transform, sx:Number, sy:Number, ptCenter:Point, angle:Number):void { 
    var mat:Matrix = t.matrix; 
    mat.tx -= ptCenter.x; 
    mat.ty -= ptCenter.y; 
    mat.rotate (angle*(Math.PI/180)); 
    mat.scale(sx,sy); 
    mat.tx += ptCenter.x; 
    mat.ty += ptCenter.y; 
    t.matrix = mat; 
} 
// usage: 
scaleRotateFromPoint(clip.transform, 1.01, 1.01, new Point(277,185), 5); 

的明顯問題,可能是因爲你指定的DisplayObject的本地座標的中心點。 中心點在父座標空間中指定。

如果您需要在局部空間指定合作ORDS,一個簡單的方法,通過使用DisplayObject.localToGlobal()globalToLocal()功能統籌空間之間轉換。 (或者,您可以invert()本地矩陣,並且transformPoint()可以在parent的空間中獲得一個點。)

-1

我覺得你的問題是,你用旋轉和縮放方法。這些都是很好的方法,但前提是您一次只應用一次轉換。

你應該單獨每個轉換的結果爲矩陣(或正確使用A,B,C等領域),然後乘以他們使用.scale(),然後.rotate()可能會互相覆蓋。

mScale.scale(0.5F,0.5F); mRotate.rotate(0.64); resultMatrix = new Matrix(image.matrix);

resultMatrix.multiply(mScale); resultMatrix.multiply(mRotate);

順便說一句這不會編譯它只是爲了顯示它是如何實現的。希望這有助於;)

+0

矩陣方法_can_可以組合,它們相當於將矩陣中的數字相乘和/或相加。一個操作不會覆蓋之前的操作,而是建立在它之上。 – aaaidan 2012-03-25 02:36:49