在as3中检测一个电影片段在舞台上被水平翻转



如果同一影片剪辑的两个实例被放置在舞台上,其中一个在Flash中被水平翻转…有没有一种方法,我可以检测哪一个已经水平翻转代码?ScaleX似乎没有变化。

使用Flash UI (Edit->Flip Horizontal)将MovieClip水平翻转,而不是通过代码。

尝试:

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 ) );
编辑:


最后一个示例意外地计算了垂直翻转而不是水平翻转。

我更喜欢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值。

最新更新