2

他の変換された DisplayObject (回転、スケーリング、引き伸ばされたオブジェクト)内にネストされている DisplayObject のコピーを取得し、それをステージ レイヤー上の同じ視覚的位置に戻すことができるようにしたいと考えています。基本的に、ネストされた DisplayObject のクローンを作成できますが、そのクローンをステージ レイヤーに追加しながら、元のオブジェクトと (視覚的に) 完全に揃えることができます (同じ位置、スケール、回転)。

私は次のようなことに取り組んできました:

// draw the pixels of a displayobject into a new bitmap object
var bitmapData:BitmapData = new BitmapData(nestedSprite.width, nestedSprite.height, true, 0xFFFFFF);
var bitmap:Bitmap = new Bitmap(bitmapData);
bitmapData.draw(nestedSprite);

// put the copy on the top most layer
stage.addChild(bitmap);

// position the copy to perfectly overlay the original, but on the top stage layer
var point:Point = nestedSprite.localToGlobal(new Point(0, 0));
bitmap.x = point.x;
bitmap.y = point.y;

ただし、これは、親が変換されていない displayObject に対してのみ有効です。完全に原点にある displayObjetcs の場合(0,0)。中央揃えのオブジェクトやスケーリングされた親などではバラバラになります。

.draw()メソッドにマトリックスパラメーターとクリッピング四角形を追加し、後でビットマップをスケーリングしたり、あるオブジェクトの変換を別のオブジェクトに設定したり、、または 、またはなど.transform.concatenatedMatrixを使用したりできることを認識しています。しかし、私は持っています残念ながら、これで試行錯誤のプログラミングを行うことになりました。いくつかの多くの変数があるため、これはプログラミングの問題を解決するための良い方法ではありません.nestedObject.getBounds(null)nestedSprite.getBounds(nestedSprite)

4

2 に答える 2

1

この関数は機能するはずだと思います。唯一の余分なステップは、連結されたマトリックスをオフセットして、原点が別の場所にあったとしても、ターゲットがビットマップの左上 (0, 0) で描画されるようにすることでした。残りは自明であることを願っていますが、意味が分からない場合はコメントを追加できます。

function createBitmapClone(target:DisplayObject):Bitmap {
    var targetTransform:Matrix = target.transform.concatenatedMatrix;
    var targetGlobalBounds:Rectangle = target.getBounds(target.stage);
    var targetGlobalPos:Point = target.localToGlobal(new Point());

    // Calculate difference between target origin and top left.
    var targetOriginOffset:Point = new Point(targetGlobalPos.x - targetGlobalBounds.left, targetGlobalPos.y - targetGlobalBounds.top);

    // Move transform matrix so that top left of target will be at (0, 0).
    targetTransform.tx = targetOriginOffset.x;
    targetTransform.ty = targetOriginOffset.y;

    var cloneData:BitmapData = new BitmapData(targetGlobalBounds.width, targetGlobalBounds.height, true, 0x00000000);
    cloneData.draw(target, targetTransform);
    var clone:Bitmap = new Bitmap(cloneData);

    // Move clone to target's global position, minus the origin offset.
    clone.x = targetGlobalPos.x - targetOriginOffset.x;
    clone.y = targetGlobalPos.y - targetOriginOffset.y;

    return clone;
}

残念ながら、DisplayObjects にフィルターがある場合、pixelBounds は (0, 0) の原点を返すように見えます。これは明らかに物事を壊します。

編集:わずかな改善として置き換えられましtarget.transform.pixelBoundsた。target.getBounds(target.stage)これにより、フィルターがある場合は位置が正しく保たれますが、親 DisplayObjects のフィルターは含まれずターゲットのフィルターは Bitmap のエッジに重なる可能性があります。それを回避する簡単な方法があるかどうかはわかりません。

更新: Jimmi Heiserman は、swf がスケーリングされるとこの機能が壊れることを発見しました。とパラメータは変更されていないstage.scaleMode = StageScaleMode.NO_SCALE;ように見えるので、私が見つけた唯一の (かなりハックな) 回避策は、「スケーリングされていない」テスト スプライトを追加し、それを使用てクローンの位置とスケールを調整することです。stageWidthstageHeight concatenatedMatrix

function createScaledBitmapClone(target:DisplayObject):Bitmap {
    var targetTransform:Matrix = target.transform.concatenatedMatrix;
    var targetGlobalBounds:Rectangle = target.getBounds(target.stage);
    var targetGlobalPos:Point = target.localToGlobal(new Point());

    // Calculate difference between target origin and top left.
    var targetOriginOffset:Point = new Point(targetGlobalPos.x - targetGlobalBounds.left, targetGlobalPos.y - targetGlobalBounds.top);

    // Create a test Sprite to check if the stage is scaled.
    var testSprite:Sprite = new Sprite();
    target.stage.addChild(testSprite);
    var testMatrix:Matrix = testSprite.transform.concatenatedMatrix;
    target.stage.removeChild(testSprite);

    // Move transform matrix so that top left of target will be at (0, 0).
    targetTransform.tx = targetOriginOffset.x * testMatrix.a;
    targetTransform.ty = targetOriginOffset.y * testMatrix.d;

    var cloneData:BitmapData = new BitmapData(targetGlobalBounds.width * testMatrix.a, targetGlobalBounds.height * testMatrix.d, true, 0x00000000);
    cloneData.draw(target, targetTransform);
    var clone:Bitmap = new Bitmap(cloneData);

    // Move clone to target's global position, minus the origin offset, and cancel out stage scaling.
    clone.x = targetGlobalPos.x - targetOriginOffset.x;
    clone.y = targetGlobalPos.y - targetOriginOffset.y;
    clone.scaleX = 1 / testMatrix.a;
    clone.scaleY = 1 / testMatrix.d;

    return clone;
}
于 2013-01-25T13:09:16.560 に答える
0

親の変換を描画に渡そうとしましたか? drawは、2 番目のパラメーターとして変換行列を取ります。

親にハンドルがある場合は、このようなものを使用できます

bitmapData.draw(nestedSprite, parent.transform.matrix);
于 2013-01-24T03:26:39.740 に答える