检测动画片段已在as3中的舞台上水平翻转

时间:2011-09-28 01:02:23

标签: flash actionscript-3 stage

如果同一个动画片段的两个影片剪辑实例放在舞台上,一个在Flash中水平翻转。有没有办法可以检测哪一个在代码中水平翻转? ScaleX似乎保持不变。

使用Flash UI(编辑 - >水平翻转)水平翻转MovieClip,而不是通过代码。

2 个答案:

答案 0 :(得分:6)

尝试:

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 ) );

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

答案 1 :(得分: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值。