Дублированный SWF-файл, загруженный с LoaderMax - PullRequest
0 голосов
/ 20 июля 2011

Я пытаюсь скопировать SWF-файл, загруженный с помощью greensocks LoaderMax, но я не могу

Я использую следующий код:

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 (актив) (взято из this

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 (который является словарем) без дублирования, он работает и отслеживается как мувиклип, но когда я пытаюсь дублировать его, даже если трассировки говорят мне, что дубликат является мувиклипом. Обратите внимание, что загружаемый клип представляет собой простую векторную графику на стадии корня временной шкалы

заранее спасибо

Obie

1 Ответ

1 голос
/ 21 июля 2011

Я не думаю, что простой вызов конструктора сработает.

Попробуйте сделать это (я предполагал определенные предыдущие знания, так как вы можете получить rawContent выше):

1) Загружать данные с использованием DataLoader в двоичном режиме .... в контексте LoaderMax это будет выглядеть так: false, maxConnections: 2}); swfLoader.append (новый DataLoader (url, {формат: 'двоичный'})); (главное - использовать DataLoader с format = 'binary')

2) По завершении сохраните ByteArray, который возвращается в ваш словарь. Первая часть приведенного выше кода в основном не изменится, хотя байты могут быть в содержимом, а не в rawContent

3) Всякий раз, когда вам требуется дубликат, используйте Loader.loadBytes () в ByteArray. то есть var ldr: Loader = new Loader (); ldr.contentLoaderInfo.addEventListener (Event.COMPLETE, swfReallyLoaded); ldr.loadBytes (_assetCache [AssetID]);

Как и при любой загрузке, вам может потребоваться установить LoaderContext, и если в AIR-allowLoadBytesCodeExecution = true; allowCodeImport = true;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...