ActionScript 2,嵌套影片剪辑列表

Posted

技术标签:

【中文标题】ActionScript 2,嵌套影片剪辑列表【英文标题】:ActionScript 2, list of nested movieclips 【发布时间】:2010-10-04 13:23:18 【问题描述】:

有没有人尝试在 Flash 8、AS 2 中获取舞台上指定停止(和当前)帧的所有影片剪辑(甚至是嵌套的剪辑)的列表?

我做了以下事情:

for(i in _root)
if(typeof(_root[i])=="movieclip")
trace(_root[i]);

但这对于第一级搜索很有用:也就是说,如果在影片剪辑中您有其他影片剪辑,则您无法找到它们。此外,在一个影片剪辑中可以有多个影片剪辑。

有没有人尝试过我想做的事?

再见!

【问题讨论】:

【参考方案1】:

完全按照 inkedmn 的建议

printStuff 首先检查它找到的值是否是 mc,如果是,则跟踪并检查其中是否有更多 mc。

printStuff = function(object)
    for(var x in object)
        if(typeof(object[x])=="movieclip")
            trace(object[x]);
            printStuff(object[x]);
        
    

printStuff(_root);

哦....对不起,因为迟到了一年,有些改变...

【讨论】:

【参考方案2】:

你只是想追踪吗?如果是这样的话,有一个不错的小无证实用程序叫做 ObjectDumper 可以做到这一点。

This is probably the best explanation of it out there

所以你可以这样做:

import mx.data.binding.ObjectDumper;

trace(ObjectDumper.toString(_root));

里面可能有很多额外的东西(函数、变量等),所以你可以使用额外的参数:

ObjectDumper.toString(obj, showFunctions, showUndefined, showXMLstructures, maxLineLength, indent)

【讨论】:

嗨,非常有价值的建议:我完全忽略了 ObjectDumper 的存在。我目前无法尝试:我的目标不完全是跟踪,而是停止在当前帧的舞台上找到的所有动画剪辑,甚至是嵌套的动画剪辑。 如果 ObjectDumper.as 代码是这个 elegancia2.com/TestSite/mx/data/binding/ObjectDumper.as 我不确定它是否适用于影片剪辑。 你说得对,我只是用它做了一个快速的小实验,它没有列出电影剪辑。我认为您唯一的选择是递归函数。或者,如果您可以控制何时放置剪辑,则将每个剪辑放到舞台上时将其放入一个数组中,然后循环遍历该数组并停止。 我没有真正的控制权:他们为我提供了由第三方内容开发人员制作的编译过的 swf,我应该使用主要的录像机命令来控制当前帧中所有影片剪辑的所有时间线。【参考方案3】:

您可以通过向 MovieClip 类添加一个函数来做类似的事情:

MovieClip.prototype.StopEverything = function()

    stop();
    for (var i in this) 
        if (typeof(this[i]) == "movieclip") 
            this[i].StopEverything();
        
    

ASSetPropFlags(MovieClip.prototype, ["StopEverything"], 1);

我发现最后一点 ASSetPropFlags 允许 StopEverything 迭代内置类,如 MovieClip 使用 for..in 用于每个字段,甚至是隐藏的属性和项目。如果没有 ASSetPropFlags,StopEverything() 可能不会命中所有包含的影片剪辑。

【讨论】:

我在评论中发布了类似的解决方案(2 月 2 日 20:01)。【参考方案4】:

我的 AS2 经验非常有限(我已经完成了一点 AS3),但这里是:

如果你编写了一个递归函数,如果遇到一个影片剪辑,它会在它的所有子对象中查找其他影片剪辑(并且对在那里找到的任何影片剪辑做同样的事情,等等)怎么办?该函数可以采用对象参数,以及每次传递时添加的“找到”剪辑数组。

我希望我能写出这样的代码,但是(正如我所说的),我不是一个 AS2 人:\

【讨论】:

事实上,一个特定的关卡可以“托管”几十个电影剪辑:您可以拥有一个,也可以拥有 100 个。因此,递归函数(这肯定是方式)很容易成为非常“消耗”的任务。 顺便说一句,这是我们的函数:function stopMCs(mc:MovieClip):Void mc.stop(); for (i in mc) if (mc[i] instanceof MovieClip) mc[i].stop();停止MCs(mc[i]); 【参考方案5】:

我今天做了与此非常相似的事情。我的剪辑是导航的一部分,是一个电影剪辑的副本。为了找出有多少,我在主舞台上放置了一个变量,该变量由电影剪辑中的动作递增。我设置了一个时间间隔,等到所有剪辑都被考虑在内,然后使用循环来填充我导航的交互性。效果也很好。希望这对某人有所帮助。

【讨论】:

【参考方案6】:

AS2.0 未记录的 ObjectDumper 功能没有在根目录枚举电影剪辑的原因是因为它忽略了对象根级别的 nameValue 对,这是一个严重的缺陷(至少可以说),因为关联的定义array 是一个数组/对象,由根处的 nameValue 对组成。

例如:trace(ObjectDumper.toString(myName:"myValue")) //output = ""。难怪他们没有记录这个“功能”。坦率地说,我认为在 AS2 和 AS3 中都没有内置方法可以轻松可靠地枚举对象的所有内容以用于调试目的,这真是令人惊讶。如果你在网上搜索,你会发现 for...in 循环的黑客作业只查看数组的根...没有递归。

【讨论】:

以上是关于ActionScript 2,嵌套影片剪辑列表的主要内容,如果未能解决你的问题,请参考以下文章

actionscript 2 影片剪辑事件不起作用

在 Actionscript 2 中立即引用影片剪辑类实例

想要在 Actionscript 2.0 Flash 中生成多个影片剪辑实例

ActionScript 3 选择影片剪辑

ActionScript:符号影片剪辑不循环

ActionScript 3:使影片剪辑播放到最后