0

greensocks LoaderMax を使用してロードした swf を複製しようとしていますが、できないようです

私は次のコードを使用しています:

private var _assetCache : Dictionary;

public function getAssetById(assetId:String):DisplayObject
{
    var asset:DisplayObject;

    if (!_assetCache[assetId])
    {
        _assetCache[assetId] = LoaderMax.getContent(assetId).rawContent;
    }

    asset = _assetCache[assetId];

    // duplicate bitmap
    if (asset is Bitmap)
    {
        var bmd:BitmapData = new BitmapData(asset.width, asset.height, true, 0);
        return new Bitmap(bmd, "auto", true);
    }
    // otherwise return 
    return SpriteUtils.duplicateDisplayObject(asset);
    //return asset; // if previous line is commented out, this works well but there will be only a single copy of the loaded swf, kinda negating the use of a cache
}

これは SpriteUtils.duplicateDisplayObject(asset) です (これから取得

static public function duplicateDisplayObject(target:DisplayObject, autoAdd:Boolean = false):DisplayObject
{
    // create duplicate
    var targetClass:Class = Object(target).constructor;
    var duplicate:DisplayObject = new targetClass();
    trace(duplicate, duplicate.height); // traces [MovieClip, 0]
    // duplicate properties
    duplicate.transform = target.transform;
    duplicate.filters = target.filters;
    duplicate.cacheAsBitmap = target.cacheAsBitmap;
    duplicate.opaqueBackground = target.opaqueBackground;
    if (target.scale9Grid)
    {
        var rect:Rectangle = target.scale9Grid;
        // WAS Flash 9 bug where returned scale9Grid is 20x larger than assigned
        // rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20;
        duplicate.scale9Grid = rect;
    }

    // add to target parent's display list
    // if autoAdd was provided as true
    if (autoAdd && target.parent)
    {
        target.parent.addChild(duplicate);
    }
    return duplicate;
}

アセットを複製せずに _assetCache (辞書) から単に返すと、ムービークリップとして機能し、トレースしますが、複製しようとすると、複製がムービークリップであることがトレースでわかります。ロードされているクリップは、タイムラインのルートのステージにある単純なベクター グラフィックであることに注意してください。

前もって感謝します

オビー

4

1 に答える 1

1

コンストラクタを呼び出すだけではうまくいかないと思います。

これを試してみてください(上記のrawContentを取得できるため、以前の知識があると想定しています):

1) バイナリ モードで DataLoader を使用してデータをロードします.... LoaderMax のコンテキストでは、swfLoader = new LoaderMax({name: "swfLoader", onProgress:swfProgressHandler, onChildComplete: swfLoaded, auditSize:false, maxConnections : 2}); swfLoader.append(新しい DataLoader(url, {format: 'binary'})); (主なポイントは、format='binary' で DataLoader を使用することです)

2) 完了したら、これが返す ByteArray を辞書に格納します。上記のコードの最初の部分は基本的に変更されませんが、bytearray は rawContent ではなく content にある可能性があります

3) 複製コピーが必要なときはいつでも、ByteArray で Loader.loadBytes() を使用します。つまり、var ldr:Loader = new Loader(); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, swfReallyLoaded); ldr.loadBytes(_assetCache[assetId]);

すべての読み込みと同様に、LoaderContext を設定する必要がある場合があります。allowCodeImport = true;

于 2011-07-21T06:34:40.083 に答える