Загрузка ресурсов .swc в массив в чистом проекте Actionscript 3

Я знаю, как загрузить символы Flash CS4 в Flash Builder через .swc. Имена классов становятся доступными в основном классе, но я могу создавать экземпляры только по одному, записывая каждое имя в код.

Как я могу просмотреть .swc и загрузить его активы в массив, не упоминая их имени, а затем получить и использовать эти имена для создания экземпляров? в идеале, что-то вроде (недооцененный псевдокод):

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

или что-нибудь еще, чтобы получить эти имена в цикле.


person Christian_R    schedule 19.11.2009    source источник


Ответы (1)


У вас есть как минимум 2 варианта.

Вариант 1. Учитывая тот факт, что файл SWC представляет собой zip-файл, содержащий SWF-файл со встроенными ресурсами и XML-файл с описанием содержимого, вы можете загрузить SWC-файл в виде zip-архива, получить XML-файл и проанализировать его.

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;
             }
            } 
        }
     }
    }
   }
  }

Я использую библиотеку nochump.

Вариант 2: поскольку вам нужны только имена классов, чтобы вам было проще, и вы упомянули об использовании Flash CS4 (что заставляет меня предположить, что у вас есть доступ к файлу .fla, генерирующему swc), вы можете написать простой скрипт jsfl, который напишет эту строку кода для вас.

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);

Все, что вам нужно сделать, это: Файл> Создать> Файл Flash Javascript и вставить код. Сохраните его в папке Commands с описательным именем, например listExportClasses. Поскольку он находится в меню «Команды», если вы используете его достаточно часто, вы можете добавить сочетание клавиш.

Команда будет генерировать массив с именем файла fla, содержать имена экспортированных классов и удобно помещать его в буфер обмена.

e.g

var assetsLibClasses = ["Start1","Start2","Start3","Button","ColorBox","GameBackground","MenuBackground"];
person George Profenza    schedule 21.11.2009
comment
Эй, большое спасибо. Я склоняюсь к первому решению, поскольку оно более «автономное». Я должен сказать, что после нескольких лет в Python это кажется ... ну, я скажу "обильно" ... Спасибо, что заставили меня начать изучать структуру .swc! - person Christian_R; 23.11.2009
comment
Честно говоря, я бы порекомендовал jsfl, использование swc означает, что вы загружаете одну и ту же информацию дважды: один раз, когда вы загружаете основной swf с помощью swc, второй раз, когда вы загружаете XML, который вы распаковываете. Стоит ли использовать библиотеку (zip) и заставлять пользователя ждать, пока один и тот же контент загрузится дважды для строки кода? Тем не менее, результат тот же. Половинчатое решение - вручную скопировать / извлечь файл catalog.xml из swc и загрузить его: меньше время загрузки, меньше кода требуется. вы можете подумать о написании xml Ant Task для распаковки / очистки в flex / eclipse. Я никогда не пробовал питон, но меня соблазняет использовать в блендере. Это приятно? - person George Profenza; 23.11.2009