Flash AS3 - 获取Library对象列表?

时间:2010-02-05 22:49:07

标签: flash actionscript-3

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

感谢。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

不是在运行时,不是。您可以在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()生成一些代码。

除此之外,我认为你最好的选择是像其他人所说的那样去做。创建一个虚拟MovieClip,其中包含每个元素并将其隐藏在舞台之外。在其上添加“添加到舞台”的侦听器并循环遍历其子节点并使用“reflection”getQualifiedClassName基于其类执行操作或仅使用实例名称和switch语句。

最后,你在每个MovieClip上“处理”的确是什么?也许它更多的是一个设计问题,它们都应该扩展一个常见的MovieClip子类,它添加了一个“添加到舞台”处理程序,你可以看到MovieClip的类型,因为它被添加到你的应用程序中并在那个中执行一些操作单功能。我正在开展一些正在进行的本地化工作,这就是我们在运行时处理多个不同剪辑的方法。

答案 2 :(得分:1)

这个问题与this one有些相似。

这是你需要列出的JSFL,只列出导出到actionscript的MovieClip:

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保存在命令文件夹中,则可以设置一个快速的键盘快捷键。

HTH, 乔治

答案 3 :(得分:0)

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

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

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

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

    d.addLocation(this);
}

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

答案 4 :(得分:0)

基本上, ...当您导出到库中的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 可能是另一种解决方案。