Loading .swc assets into array, in pure Actionscript 3 project
Asked Answered
M

1

3

I know how to get Flash CS4 symbols into Flash Builder via .swc. The class names become available in the main class, but I can only instantiate those one by one, writing each name into the code.

How can I loop through the .swc and load its assets in an array without mentioning their name, then obtain and use these names for instantiation? ideally, something like (half-assed pseudocode):

the_instances: = new Array
for(i=0; i<the_SWC.length; i++)
{
    tmp = new eval( the_SWC[i].name + '\(\)' )
    the_instances.push( tmp )
}

or anything else to get those names in a loop.

Marashio answered 19/11, 2009 at 16:53 Comment(0)
L
3

You have at least 2 options.

Option1: Given the fact that a SWC file is a zip file that contains a swf with the embedded assets and an xml file describing the contents, you can load the swc as a zip, get the xml and parse it.

var swcLoader:URLLoader = new URLLoader(new URLRequest('assets/assetsLib.swc'));
   swcLoader.dataFormat = URLLoaderDataFormat.BINARY;
   swcLoader.addEventListener(Event.COMPLETE, swcLoaded);

function swcLoaded(event:Event):void{
   var zipFile:ZipFile = new ZipFile(event.target.data);
   for(var i:int = 0; i < zipFile.entries.length; i++) {
    var entry:ZipEntry = zipFile.entries[i];
    if(entry.name == 'catalog.xml'){
     var data:ByteArray = zipFile.getInput(entry);
     var list:XML = new XML(zipFile.getInput(entry));
     var nodes:XMLList = list.children();
     for (var j:int = 0; j < nodes.length(); j++) {
      if (nodes[j].name().localName == "libraries") {
            var libraries:XML = nodes[j];
            var libList:XMLList = libraries.children();
            for(var k:int = 0 ; k < libList.length(); k++){
             var library:XML = libList[k];
             var classList:XMLList = library.children();
             for(var l:int = 0 ; l < classList.length(); l++){
              var classDef:XML = classList[l];
              trace('class name: ' + classDef.@name);
              //var LibClass:Class = this.loaderInfo.applicationDomain.getDefinition(classDef.@name) as Class;
             }
            } 
        }
     }
    }
   }
  }

I am using the nochump library.

Option2: Since you only need the class names to make your like easier and you mentioned using Flash CS4(which makes me assume you have access to the .fla file generating the swc), you can write a simple jsfl script that will write that line of code for you.

var doc = fl.getDocumentDOM();
var libItems = doc.library.items;
var libItemsNum = libItems.length;
var classesString = 'var '+doc.name.substr(0,doc.name.length-4)+'Classes = [';
var classesNum = 0;
var classes = [];

fl.outputPanel.clear();
for(var i = 0 ; i < libItemsNum; i++){
 if(libItems[i].linkageExportForAS){
  classes[classesNum] = libItems[i].linkageClassName;
  classesNum++;
 }  
}
for(i = 0; i < classesNum; i++){
 if(i < classesNum-1) classesString += '"'+classes[i]+'",';
 else      classesString += '"'+classes[i]+'"];';
}
fl.clipCopyString(classesString);
fl.trace(classesString);

All you need to do is: File > New > Flash Javascript File and paste the code. Save it in the Commands folder with a descriptive name, like: listExportClasses. Since it's in the Commands menu, if you use this often enough you could add a keyboard shortcut.

What the command will is generate an array with the name of the fla file and contain the exported classes' names and conveniently place it in your clipboard.

e.g

var assetsLibClasses = ["Start1","Start2","Start3","Button","ColorBox","GameBackground","MenuBackground"];
Lynnlynna answered 21/11, 2009 at 11:48 Comment(2)
Hey, thanks a lot. I'm leaning towards the first solution as it's more 'self-contained'. I gotta say, after a few years in Python, this feels... well, I'll say 'copious'... Thanks for making me start learning about the structure of the .swc as well!Marashio
I would recommend jsfl to be honest, using swc means you load the same information twice:once as you main swf loads with the swc, the second time when you load the xml you unzip. is it worth using a library(zip) and having the user to wait for the same content to load twice for a line of code?Still, the result is the same. A halfway solution is to manually copy/extract the catalog.xml from the swc and load that: less load time, less code needed. you might consider writing an xml Ant Task for that unzip/clean in flex/eclipse. I never tried python, but it tempts me to use in blender.is it nice?Lynnlynna

© 2022 - 2024 — McMap. All rights reserved.