【问题标题】:Loading .swc assets into array, in pure Actionscript 3 project在纯 Actionscript 3 项目中将 .swc 资产加载到数组中
【发布时间】:2010-12-18 09:34:38
【问题描述】:

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

如何在不提及名称的情况下遍历 .swc 并将其资产加载到数组中,然后获取并使用这些名称进行实例化?理想情况下,类似(半途而废的伪代码):

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

或其他任何东西都可以在循环中获取这些名称。

【问题讨论】:

    标签: actionscript-3 import class symbols swc


    【解决方案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 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 文件名称的数组,并包含导出的类的名称,并将其方便地放置在剪贴板中。

    例如

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

    【讨论】:

    • 嘿,非常感谢。我倾向于第一个解决方案,因为它更“独立”。我得说,在 Python 工作了几年之后,这种感觉……嗯,我会说“丰富”……感谢您让我也开始了解 .swc 的结构!
    • 老实说,我会推荐 jsfl,使用 swc 意味着您两次加载相同的信息:一次是在使用 swc 加载主 swf 时,第二次是在加载解压缩的 xml 时。是否值得使用库(zip)并让用户等待相同的内容为一行代码加载两次?仍然,结果是一样的。一个半途而废的解决方案是从 swc 中手动复制/提取 catalog.xml 并加载它:更少的加载时间,更少的代码需要。您可能会考虑在 flex/eclipse 中为 unzip/clean 编写一个 xml Ant 任务。我从未尝试过 python,但它很吸引我在 blender 中使用。它很好吗?
    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2010-09-26
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多