2

ある階層から別の階層に親を変更するときに、表示オブジェクトの同じ変換を維持することに問題があります。下の画像では、ネストされた子 "mc2" を持つムービー クリップ "mc1" を確認できます。「mc2」には独自の子「mc3」があります。各子孫は何らかの形で変換されます (回転、スケールなど)。階層「mc1」から「mc4」を取り、階層「do1」の「do3」に入れたいと思います(これも各レベルで異なる変換があります)。

では、外観 (場所を除く) を変更せずに正方形の "mc4" を他の階層に配置するにはどうすればよいでしょうか? (ドラッグ アンド ドロップを想像してください)。

Transform.concatenedMatrix プロパティでやってみましたが、迷ってしまいました。

ありがとう!

ネストされたムービー クリップ

4

2 に答える 2

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;

}       
于 2012-07-04T10:29:16.560 に答える
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;

}
于 2012-06-28T22:51:36.910 に答える