0

我通过 Loader() 类加载 swf。加载 swf 时,我循环遍历 root 的所有子项,并使用 removeChild() 删除任何 TextField。这最初有效 - TextField 被删除。但是当加载的 swf 中的补间完成并循环时,被删除的 TextField 以某种方式重新出现。TextField 是动态文本。如果我删除了一些 StaticText,这将保持删除。这里发生了什么?

loopChildren(root);
function loopChildren(dispObj:*):void {
    for (var i:int = 0; i< dispObj.numChildren; i++) {
        var obj:DisplayObject = dispObj.getChildAt(i);
        if (obj is DisplayObjectContainer) {
            loopChildren(obj);
        }
        else {
            if (obj is TextField) {
                obj.parent.removeChild(obj);
                i--;
            }
        }
    } 
}

如果我用计时器(5 秒间隔)和所有孩子的 trace(obj.name) 调用 loopChildren,我注意到 obj.name 发生了变化。TextField 称为 instance11、instance32、instance54 等。好像是在不断的创建和添加一个新的实例?

编辑:如果我将代码直接传输到 swf 并在不使用包装器的情况下运行它,它会按预期工作。我一定错过了通过另一部电影加载时发生的事情?

EDIT2:我应该说我要删除的 TextField 与补间位于同一时间线上的单独层中。如果我将补间放在自己的时间线上,它似乎可以按预期工作。但是动态文本和补间不能共存吗?

4

2 回答 2

2

听起来您的文本字段是在舞台上定义的(即在 FLA 中,而不是由脚本实例化),并且它所在的图层可能具有在补间中某个点播放的关键帧。

如果这是正确的,那么您遇到的是 Flash 的一个相当低级别的限制,涉及时间线和脚本环境的竞争性质。当您播放补间时,每个时间轴关键帧都会为 Flash 编码一些信息,例如在该点上舞台上应该有哪些类型的对象,以及它们应该在哪里等。

但是,当您也开始使用脚本引用那些相同的对象时,通常 Flash 必须猜测您是否希望脚本或时间轴中的信息优先。在这种情况下,可能发生的情况是,在您使用脚本删除文本字段后,您的补间播放的帧之一引用了相同的字段,并且 Flash 不知道删除是否应该是永久性的,或者是否尊重关键帧并重新创建字段。

因此,对您的问题的简短回答(为时已晚!)一般来说,您应该尝试使用时间线补间或脚本来处理您的舞台元素,但不能同时使用两者。这就是您在编辑#2 中的解决方案有效的原因;因为通过将补间移动到它自己的时间轴上,(我猜)你不再在关键帧之间播放,这些关键帧对相关文本字段的信息进行了编码。另一种解决方案可能是通过时间线删除有问题的文本字段(通过播放到该文本字段不再存在的关键帧)。或者,当然您也可以仅通过脚本控制您的文本字段,创建和销毁它,因此它根本不是时间线的一部分。

于 2009-09-05T06:17:05.250 回答
0

为什么不将文本字段设置为空?

loopChildren(root);

function loopChildren(dispObj:DisplayObjectContainer):void 
{
    for each(var i:int = 0; i < dispObj.numChildren; i++) 
    {
        var obj:DisplayObject = dispObj.getChildAt(i);
        if (obj is DisplayObjectContainer) 
        {
            loopChildren(obj);
        }
        else if (obj is TextField) 
        {
            TextField(obj).text = "";
        }
    } 
}
于 2009-09-05T12:20:23.093 回答