2012-03-22 83 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