重新显示对象时转换矩阵操作

时间:2012-06-28 21:48:12

标签: actionscript-3 flash matrix

在从一个层次结构重新托管到另一个层次结构时,我有一个问题就是保持显示对象的相同转换。在下图中,您可以看到嵌套子“mc2”的影片剪辑“mc1”。 “mc2”有自己的孩子“mc3”等等。每个后代都以某种方式变换(旋转,缩放等)。我想从层次结构“mc1”中取“mc4”并将其放在层次结构“do1”的“do3”中(在每个级别中也有不同的转换)。

那么如何在不将其外观(位置除外)改为其他层次结构的情况下放置方形“mc4”? (想象一下拖放)。

我尝试使用Transform.concatenedMatrix属性,但我迷路了。

谢谢!

nested movie clips

2 个答案:

答案 0 :(得分:3)

经过几次实验后,我找到了正确答案:

    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.geom.Matrix; 


function changeParent ( displayObject : DisplayObject, newParent : DisplayObjectContainer, depth : int = -1 ) : void {

    var concatenedChildMatrix       : Matrix = displayObject.transform.concatenatedMatrix;

    var concatenedNewParentMatrix   : Matrix = newParent.transform.concatenatedMatrix;

    // invert matrix. It couses visual removal of transformations (movie clip looks like it wasn't transformed )
    concatenedNewParentMatrix.invert();

    concatenedChildMatrix.concat( concatenedNewParentMatrix );

    // if you want to add clip not on top level
    if ( depth >= 0 ) {
        newParent.addChildAt( displayObject, depth );
    } else {
        newParent.addChild( displayObject );
    }

    // assign matrix back
    displayObject.transform.matrix = concatenedChildMatrix;

}       

答案 1 :(得分:1)

你可以尝试这个,它适用于我的情况(当你所做的只是修改比例/ x / y /旋转属性),但在使用转换矩阵时可能无法正常工作。

function changeParent(displayObj:DisplayObject, newParent:DisplayObjectContainer, depth:Number = -1, retainRelativeSize:Boolean = false):void {
var tmpParent:DisplayObjectContainer = displayObj.parent;

    while (tmpParent) {
        displayObj.scaleX *= tmpParent.scaleX;
        displayObj.scaleY *= tmpParent.scaleY;
        displayObj.rotation += tmpParent.rotation;
        tmpParent = tmpParent.parent;
    }

    tmpParent = newParent;
    while(tmpParent){
        displayObj.scaleX = displayObj.scaleX / tmpParent.scaleX;
        displayObj.scaleY = displayObj.scaleX / tmpParent.scaleY;
        displayObj.rotation -= tmpParent.rotation;
        tmpParent = tmpParent.parent;
    }

    var point1:Point= displayObj.localToGlobal(new Point());
    var point2:Point = newParent.globalToLocal(point1);

    if (depth >= 0) {
        newParent.addChildAt(displayObj, depth);
    }else {
        newParent.addChild(displayObj);
    }

    displayObj.x = point2.x;
    displayObj.y = point2.y;

}