Flash AS3 - 如何获取库中对象列表?

8

有没有一种方法可以访问或迭代Flash IDE导出到ActionScript的所有对象列表?我想通过只迭代选择的MC并以某种方式处理它们来节省一些麻烦,而不知道它们的名称。

谢谢。

5个回答

2

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,将每个元素放在其中并将其隐藏在舞台外。为其添加"added to stage"监听器,循环遍历其子元素并使用"reflection" getQualifiedClassName根据其类执行操作,或者只使用实例名称和switch语句。

最后,你到底是在每个MovieClip上进行什么样的"处理"呢?也许这更多地是一个设计问题,它们都应该扩展一个共同的MovieClip子类,该子类具有一个"added to stage"处理程序,在其中查看MovieClip的类型,当它被添加到你的应用程序中时执行一些操作。我现在正在工作中处理一些本地化工作,这就是我们如何处理运行时多个不同剪辑的方式。


1

这个问题有点类似于 这个

这是你需要列出仅导出到ActionScript的MovieClips的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 文件夹中,则可以为其设置快捷键以提高速度。
希望有所帮助, 乔治

0

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

我试图将IDE中放置的位置信息提供给游戏。

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

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

    d.addLocation(this);
}

然后在Game类中,我能够将它们添加到数组中并遍历它们。我确定这不是最好的方法,但它起作用了。

您可以将每个MC添加到一个容器中,然后通过迭代容器来查找位置和其他内容。但我希望避免中间步骤。 - Scott

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 可能是一种替代方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接