将.swc资产加载到数组中,在纯ActionScript 3项目中 [英] Loading .swc assets into array, in pure Actionscript 3 project

查看:176
本文介绍了将.swc资产加载到数组中,在纯ActionScript 3项目中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道如何通过.swc获取Flash CS4符号到Flash Builder。
类名在主类中可用,但我只能逐个实例化,将每个名字写入代码。

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.

如何循环通过.swc并将其资产加载到数组中而不提及其名称,然后获取并使用这些名称进行实例化?理想情况下,类似于(半条件伪代码):

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.

推荐答案

您至少有两个选项。

Option1:
考虑到SWC文件是一个zip文件,其中包含具有嵌入资源的swf和描述内容的xml文件,加载swc作为zip,获取xml并解析它。

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

我使用 nochump库

Option2:
因为你只需要类名,使你更容易,你提到使用Flash CS4(这让我假设你有权访问.fla文件生成swc),你可以写一个简单的jsfl脚本来为你写这行代码。

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

所有您需要做的是:
File> New> Flash Javascript File并粘贴码。
将其保存在具有描述性名称的Commands文件夹中,如:listExportClasses。
因为它在命令菜单中,如果你经常使用这个,你可以添加一个键盘快捷键。

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.

命令将生成一个名称

例如

var assetsLibClasses = ["Start1","Start2","Start3","Button","ColorBox","GameBackground","MenuBackground"];

这篇关于将.swc资产加载到数组中,在纯ActionScript 3项目中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆