2011-09-28 75 views
3

如果同一个动画片段的两个影片剪辑实例放置在舞台上,并且一个在Flash中水平翻转..是否有方法可以检测到哪一个已翻转在代码中水平吗? ScaleX似乎保持不变。检测动画片段已被水平翻转在舞台上as3

使用Flash UI(Edit-> Flip Horizo​​ntal)而不是通过代码水平翻转MovieClip。

+0

MovieClip是如何翻转的? – sberry

+0

对不起,我应该更具体。在FLA的库中有一个父剪辑链接。它作为SWC导出,这是从代码访问的内容。代码将这个链接的父剪辑添加到它的舞台上。在父剪辑中,从FLash IDE中放置两个子剪辑。一个翻转(编辑>水平翻转),另一个不是。我无法弄清楚如何通过代码翻译哪一个。 – prettymuchbryce

回答

5

尝试:

function isFlippedHorizontally(obj:DisplayObject):Boolean 
{ 
    return obj.transform.matrix.a/obj.scaleX == -1; 
} 

trace(isFlippedHorizontally(yourObject)); 

编辑:
我应该占到对象的scaleX;现在调整。

或者:

import fl.motion.MatrixTransformer; 

function isFlippedHorizontally(obj:DisplayObject):Boolean 
{ 
    return MatrixTransformer.getSkewYRadians(obj.transform.matrix)/Math.PI == 1; 
} 

trace(isFlippedHorizontally(yourObject)); 

编辑:
最后例如偶然有计算在水平翻转代替垂直翻转。

+0

+1这为我工作。 – Marty

+0

如果对象已被翻转和缩放,检查'obj.transform.matrix.a/obj.scaleX <0;'是否正确? –

0

我喜欢fireeyedoy的解决方案更加为它的紧凑性和简单,但你也可以用一些比较的BitmapData做到这一点:

var bmd1:BitmapData = new BitmapData(mc1.width, mc1.height); 
var bmd2:BitmapData = new BitmapData(mc2.width, mc2.height); 
var cbmd1:BitmapData = new BitmapData(mc1.width, mc1.height); 
var cbmd2:BitmapData = new BitmapData(mc2.width, mc2.height); 

var cmatrix1:Matrix = new Matrix(); 
var cmatrix2:Matrix = new Matrix(); 

cmatrix1.tx = -mc1.x; 
cmatrix1.ty = -mc1.y; 

cmatrix2.tx = -mc2.x; 
cmatrix2.ty = -mc2.y; 

bmd1.draw(mc1); 
bmd2.draw(mc2); 

cbmd1.draw(this, cmatrix1); 
cbmd2.draw(this, cmatrix2); 


if(cbmd1.compare(bmd1)) 
{ 
    trace("mc1 is flipped!"); 
} 
else if(cbmd2.compare(bmd1)) 
{ 
    trace("mc2 is flipped!"); 
} 

这是假设你的影片剪辑的左上角对齐。如果不是,那么在绘制它们时,必须在矩阵中添加适当的tx和ty值。