2011-07-20 4 views
0

je suis en train de dupliquer un fichier SWF chargé à l'aide greensocks LoaderMax mais je ne semble pas être en mesure dedupliqués un swf chargé de LoaderMax

je suis en utilisant le code suivant:

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 
} 

et cela est (prise de 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; 
} 

SpriteUtils.duplicateDisplayObject (atout) si je retourne simplement l'actif de _assetCache (qui est un dictionnaire) sans dupliquer, il fonctionne et trace s comme un MovieClip mais quand j'essaye de le dupliquer, même si les traces me disent que le doublon est un MovieClip. Notez le clip en cours de chargement est un graphique simple vecteur sur la scène de la racine de la chronologie

merci à l'avance

Obie

Répondre

1

Je ne pense pas simplement appeler le constructeur va fonctionner.

Essayez de faire cela (je l'ai assumé certaines connaissances antérieures puisque vous êtes en mesure d'obtenir rawContent ci-dessus):

1) Chargez les données en utilisant DataLoader en mode binaire .... dans le contexte de LoaderMax ce serait comme: swfLoader = new LoaderMax ({nom: "swfLoader", onProgress: swfProgressHandler, onChildComplete: swfLoaded, auditSize: faux, maxConnections: 2}); swfLoader.append (nouveau DataLoader (url, {format: 'binaire'})); (le point principal est d'utiliser DataLoader avec format = 'binary')

2) Une fois terminé, stockez le ByteArray que cela renvoie dans votre dictionnaire. La première partie de votre code ci-dessus sera fondamentalement inchangée, bien que le bytearray soit contenu plutôt que rawContent

3) Chaque fois que vous avez besoin d'une copie, utilisez Loader.loadBytes() sur ByteArray. c'est-à-dire var ldr: Loader = new Loader(); ldr.contentLoaderInfo.addEventListener (Event.COMPLETE, swfReallyLoaded); ldr.loadBytes (_assetCache [assetId]);

Comme pour tout chargement, vous devrez peut-être définir un LoaderContext, et si AIR- allowLoadBytesCodeExecution = true; allowCodeImport = true;

+0

merci - je vais tester ça – obie

Questions connexes