【问题标题】:Flash AS3 - Getting a list of Library objects?Flash AS3 - 获取库对象列表?
【发布时间】:2011-01-13 17:41:53
【问题描述】:

有没有办法访问或遍历从 Flash IDE 导出到 ActionScript 的所有对象的列表?我希望通过迭代选定的 MC 并以某种方式处理它们,而不知道它们的名称,从而为自己节省一些麻烦。

谢谢。

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    我遇到了类似的问题,如果有更好的解决方案,我会对解决方案感兴趣。不过,我最终做的是让每个元素的构造函数找到文档类(通过调用 this.parent 直到找到正确的类),然后调用该文档类的函数。

    我试图向游戏提供有关我通过 IDE 放置的位置的信息。

    所以我给了 Location 一个这样的构造函数:

    public function Location(){
        var d:DisplayObject = parent;
        while(!(d is Game)){
           d = d.parent
        }
    
        d.addLocation(this);
    }
    

    然后在 Game 类中,我能够将它们添加到数组中并遍历它们。我很肯定这不是最好的方法,但它确实有效。

    【讨论】:

    • 您可以将每个 MC 添加到一个容器中,然后遍历该容器以获取位置和内容。希望避免中间步骤。
    【解决方案2】:

    基本上,...当您导出到库中的 ActionScript 时,它就变成了一个类。与其他类相同 - MovieClip、Loader...等。这些都是编译时属性。基本上,没有办法在运行时找出这些类。

    但是,您提到了遍历 MC 并对它们做一些事情。如果您需要根据他们的班级对已经在舞台上的 MC 做一些事情,您可以使用以下方法:

    for (var i=0; i<this.numChildren; i++){
        trace("Movie Name: "+this.getChildAt(i).name);
        trace("Movie Class: "+getQualifiedClassName(this.getChildAt(i)));
    }
    

    使用上述循环和 getQualifiedClassName 可能是另一种解决方案。

    【讨论】:

      【解决方案3】:

      不是在运行时,不是。不过,您可以在 IDE 中使用 JSFL 操作库对象:http://livedocs.adobe.com/flash/9.0/main/flash_cs3_extending.pdf。不确定这是否有帮助,但也许您可以通过以某种方式分析库来生成用于应用程序的代码。

      var lib = fl.getDocumentDOM().library;
      for (var i = 0; i < lib.items.length; i++)
      {
          var item = lib[0];
          fl.trace(item.name + " " + item.getItemType());
      }
      

      也许会根据库对象的getItemProperty()getItemType() 生成一些代码。

      除此之外,我认为你最好的选择是按照其他人所说的去做。创建一个包含每个元素的虚拟影片剪辑,并将其隐藏在舞台之外。在其上添加一个用于“添加到舞台”的侦听器并遍历其子级并使用“反射”getQualifiedClassName 根据其类执行操作,或者仅使用实例名称和 switch 语句。

      不过,最后,您在每个 MovieClip 上“处理”的具体内容是什么?也许这更像是一个设计问题,它们都应该扩展一个公共的 MovieClip 子类,该子类添加了一个“添加到舞台”处理程序,您可以在其中查看 MovieClip 的类型,因为它添加到您的应用程序并在该 中执行一些操作单个 函数。我现在正在进行一些本地化工作,这就是我们在运行时处理多个不同剪辑的方式。

      【讨论】:

        【解决方案4】:

        这个问题有点类似于this one

        这是您需要列出唯一导出到 actionscript 的 MovieClip 的 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);
        

        它将导出类的名称作为字符串数组追踪,因此您可以将其与 ApplicationDomain 的 getDefinitionByName()flash.utils.getDefinition() 一起使用. 此外,它会将跟踪的消息复制到剪贴板。如果将 JSFL 保存在 Commands 文件夹中,则可以设置键盘快捷键以加快速度。

        HTH, 乔治

        【讨论】:

          【解决方案5】:

          我使用这里描述的 SwfClassExplorer:http://flassari.is/2008/07/swf-class-explorer-for-as3/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-22
            • 1970-01-01
            • 2013-08-18
            • 2012-04-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-29
            相关资源
            最近更新 更多