2009-11-19 3 views
2

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

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

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

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

ответ

2

У вас есть как минимум 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: ' + [email protected]); 
       //var LibClass:Class = this.loaderInfo.applicationDomain.getDefinition([email protected]) as Class; 
      } 
      } 
     } 
    } 
    } 
    } 
    } 

Я использую nochump library.

Option2: Так вам нужны только имена классов, чтобы сделать ваше подобие проще и вы упомянули, с помощью 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); 

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

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

например
var assetsLibClasses = ["Start1","Start2","Start3","Button","ColorBox","GameBackground","MenuBackground"]; 
+0

Эй, спасибо много. Я склоняюсь к первому решению, поскольку оно более «самодостаточно». Я должен сказать, что через несколько лет в Python это чувствует ... ну, я скажу «обильный» ... Спасибо, что заставило меня начать изучать структуру .swc! –

+0

Я бы порекомендовал jsfl, если честно, используя swc означает, что вы загружаете одну и ту же информацию дважды: один раз, когда вы загружаете основную swf с помощью swc, во второй раз, когда вы загружаете xml, вы разархивируете. стоит ли использовать библиотеку (zip) и заставить пользователя ждать, пока один и тот же контент дважды загрузится для строки кода? Тем не менее, результат тот же. Решение на полпути - это вручную скопировать/извлечь файл catalog.xml из swc и загрузить его: меньше времени загрузки, меньше необходимого кода. вы можете подумать о написании задачи xml Ant для этого разархивирования/очистки в flex/eclipse. Я никогда не пробовал питон, но он искушает меня использовать в blender.is это приятно? –

Смежные вопросы