2009-11-19 54 views
2

我知道如何通過.swc將Flash CS4符號導入Flash Builder。 類名在主類中可用,但我只能將它們逐個實例化,並將每個名稱寫入代碼中。將.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個選項。

Option1: 鑑於SWC文件是一個zip文件,其中包含帶嵌入資產的swf和描述內容的xml文件,您可以將zip加載爲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

選項2: 由於您只需要類名使您更容易,並且您提到使用Flash CS4(這使我可以訪問生成swc的.fla文件),因此您可以編寫簡單的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"]; 
+0

嘿,非常感謝。 我傾向於第一個解決方案,因爲它更「自包含」。我得說,以後在Python幾年,這種感覺......嗯,我會說「豐富」 ...... 謝謝你讓我開始學習有關的名爲.swc的結構,以及! – 2009-11-23 17:53:16

+0

我會建議JSFL說實話,使用SWC意味着你兩次加載相同的信息:一次作爲你主要SWF文件加載與深港西部通道,當你加載你解壓縮XML的第二次。是否值得使用庫(zip)並讓用戶等待相同的內容爲代碼行加載兩次?仍然,結果是相同的。中途的解決方案是手動複製/從SWC中提取的catalog.xml並加載:較少負載時間,所需的代碼少。您可能會考慮爲flex/eclipse中的unzip/clean編寫一個xml Ant任務。我從來沒有嘗試python,但它誘使我在blender.is中使用它很好嗎? – 2009-11-23 18:28:16

相關問題