【问题标题】:Detecting a movieclip has been Flipped horizontally on the stage in as3as3中检测到movieclip在舞台上水平翻转
【发布时间】:2011-09-28 01:02:23
【问题描述】:

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

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

【问题讨论】:

  • MovieClip 最初是如何翻转的?
  • 对不起,我应该更具体。在 FLA 的库中链接了一个父剪辑。它作为 SWC 导出,这是从代码中访问的内容。代码将此链接的父剪辑添加到它的阶段。在父剪辑中有两个从 FLash IDE 放置在其中的子剪辑。一个是翻转的(编辑>水平翻转),另一个不是。我不知道如何通过代码来辨别哪一个被翻转了。

标签: flash actionscript-3 stage


【解决方案1】:

试试:

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

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

【讨论】:

  • 如果对象已经被翻转和缩放,那么检查obj.transform.matrix.a / obj.scaleX < 0;是否正确?
【解决方案2】:

我更喜欢 fireeyedoy 的解决方案,因为它紧凑且简单,但您也可以通过一些位图数据比较来做到这一点:

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 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多