获取Flash影片中的所有命名实例

时间:2008-11-18 10:31:45

标签: flash actionscript-3 actionscript-2 instance

是否可以使用actionscript 2获取flash影片中具有名称的所有实例的列表。就像包含所有命名文本区域或所有movieClip实例等的数组一样。我想得到这个,以便设计师可以添加或者删除文本区域等,动作脚本可以动态地找到它们并从单独的数据源获取文本。

我想我想要的是类似于DOM树的东西,甚至更像是getElementByName()如何在JavaScript中运行。并且还获取实例名称的字符串值,以便我可以在xml中找到它的文本值。

假设设计人员添加一个名为“copyright”的新文本区域,我的代码应该(无需更改脚本)在XML文件中找到id为“copyright”的数据(如果有),并添加文本区域的值。

3 个答案:

答案 0 :(得分:2)

@Stein Gauslaa Strindhaug

这非常粗糙,但它应该可以做到!

private function traceAllChildren(rootContainer:DisplayObjectContainer):void {
    for(var i=0; i < rootContainer.numChildren; i++) {
        var item:* = rootContainer.getChildAt(i);
        try {
            traceAllChildren(item);
        } catch (e:Error) {
            trace(e.toString());
        }
        trace(item.toString());
        // This is the block where you can affect
        // an 'item' depending on it's type, name, etc..
        // eg: 
        //      if (item.toString() == '[object TextField]') {
        //          item.text = "The text I want to insert";
        //      }
        // or
        //      if (item.name == myTextFieldNameVar) {
        //          item.text = "The text I want to insert";
        //      }
    }
}

然后调用它:traceAllChildren(this)或traceAllChildren(myParentMovieClip)。

我希望这有帮助,祝你好运!

答案 1 :(得分:1)

简短回答:没有“内置”方式来做到这一点。您可以尝试尝试类似于getElementByName()的功能,但它需要从_root开始并通过您的内容进行搜索 - 严格来说,影片剪辑从对其子节点的引用开始,但它们可以在运行时删除,所以这可能会失败。

话虽如此,这是一个常见问题,并且有很多方法。您可能会发现更有用的一件事是创建一个附加到自定义类的自定义组件 - 比如“TextPlaceholder”,并让您的设计者将它们的副本放在他们想要动态文本的位置。然后在运行时,此组件可以检查其_name属性或其他自定义组件参数,并基于它们可以创建适当大小,内容等的文本字段。这只是接近它的一种方式。

答案 2 :(得分:0)

我做了AS2编码已经有一段时间了,但也许您可以使用MovieClip.getInstanceAtDepth()和this.getNextHighestDepth()的组合来查找电影中的最高深度,然后追溯到每个较低的深度,直到找到一个getInstanceAtDepth(),它对应于您要用新数据填充的剪辑。

我还注意到AS2文档中的这个示例代码。

以下代码跟踪舞台上所有影片剪辑实例的深度:

for (var i in this) {
    if (typeof (this[i]) == "movieclip") {
    trace("movie clip '"+this[i]._name+"' is at depth "+this[i].getDepth());
    }
}
PS:我知道你可能不想听到这个但是在AS3中它是一个轻而易举的因为你可以遍历这个。孩子们!