有没有一种方法可以访问或迭代Flash IDE导出到ActionScript的所有对象列表?我想通过只迭代选择的MC并以某种方式处理它们来节省一些麻烦,而不知道它们的名称。
谢谢。
有没有一种方法可以访问或迭代Flash IDE导出到ActionScript的所有对象列表?我想通过只迭代选择的MC并以某种方式处理它们来节省一些麻烦,而不知道它们的名称。
谢谢。
不,在运行时不可以。但是你可以在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的类型,当它被添加到你的应用程序中时执行一些操作。我现在正在工作中处理一些本地化工作,这就是我们如何处理运行时多个不同剪辑的方式。
这个问题有点类似于 这个。
这是你需要列出仅导出到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);
我曾经遇到过类似的问题,如果有更好的解决方案,我会很感兴趣。但是我最终做的是让每个元素的构造函数找到文档类(通过调用this.parent直到找到一个正确的类),然后调用该文档类的一个函数。
我试图将IDE中放置的位置信息提供给游戏。
所以我给Location添加了这样一个构造函数:
public function Location(){
var d:DisplayObject = parent;
while(!(d is Game)){
d = d.parent
}
d.addLocation(this);
}
基本上,没有... 当你在库中导出到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 可能是一种替代方案。