删除movieclip子项的动作脚本

Posted

技术标签:

【中文标题】删除movieclip子项的动作脚本【英文标题】:actionscript removing movieclip children 【发布时间】:2012-08-15 12:35:15 【问题描述】:

我在这个类中有一个文档类,我动态创建影片剪辑,将它们存储在一个数组中,最后使用 addChild 将其添加到舞台。没关系,问题是虽然我试图通过数组删除movieClips,但它抛出了一个错误:

1034:类型强制失败:无法将 []@26be1fb1 转换为 flash.display.DisplayObject。

这是我的代码:

    // Note i have declared the array outside the function, so that's not an issue
    function x (e:MouseEvent)
    
        
        if (thumbnails.length !== 0) // Determine if any movieclips have already been created on stage and delete them
            for(var ctr:int = 0; ctr < thumbnails.length;ctr++ )
                removeChild(thumbnails[ctr]);
                
            
            
        
        for (var i: int = 0;i < userIput; i++) // Loop through and create instances of symbol
            
            
            var thumb:Thumbnail = new Thumbnail();
            
            thumb.y = 180; // Set y position
            thumb.x = 30 + ((thumb.width + 10) * i); 
            
            
            addChild(thumb);

            thumbnails[i] = [thumb]; // Add to array
        
    

【问题讨论】:

你能粘贴Thumbnail的第一行吗?以public class Thumbnail开头的那个... 【参考方案1】:

当您从Array 检索MovieClip 时,您需要将其转换为DisplayObject,然后再尝试删除它:

    if (thumbnails.length !== 0) // Determine if any movieclips have already been created on stage and delete them
        for(var ctr:int = 0; ctr < thumbnails.length;ctr++ )
            removeChild(DisplayObject(thumbnails[ctr]));

        

    

或者,您可以考虑使用VectorArray 的类型安全版本)并将基本类型设置为DisplayObject

var thumbnails:Vector.<DisplayObject> = new Vector.<DisplayObject>();
thumbnails.push(new MovieClip());

this.addChild(thumbnails[0]);
this.removeChild(thumbnails[0]);

如需进一步阅读,请查看 type conversion 和 Vectors 上的 Adob​​e 文档。

更新:

下面的行实际上是在您的缩略图Array 中添加一个包含单个元素的Array,而不是添加Thumbnail 的实例(实际上,您正在创建一个多维@987654336 @):

// You're assigning an array literal with a single element 
// to this element of the the thumbnails array
thumbnails[i] = [thumb]; 

请尝试以下任一方法:

 // What you meant
 thumbnails[i] = thumb; 

 // Better
 thumbnails.push(thumb);

【讨论】:

试过了...但仍然抛出相同的错误,我将它转换为显示对象但仍然无法正常工作,为了调试,我跟踪了实际的数组元素,它打印了 [object Thumbnail] x 很多次,具体取决于在我假设的 userInput 上意味着数组中的内容没有错误 非常感谢这是实际问题...应该没有括号拇指 没关系。如果对您有帮助,请记住接受答案。【参考方案2】:

出现的错误告诉您 Flash Player 无法将 []@26be1fb1 转换为 DisplayObject。 []@26be1fb1 提示您无法转换地址的对象类型。 [] 是这里的对象类型,表示 Array 类型,因此当调用 removeChild() 时,您尝试将数组传递给它,但该方法需要 DisplayObject。

为什么会这样

您的代码有一个非常简单但可能不引人注目的问题,即在此代码行:

thumbnails[i] = [thumb]; // Add to array

您通过在thumb 周围使用[] 将拇指放入一个数组中。因此,您的代码实际上正在做的是将一个具有单个元素 (thumb) 的数组添加到数组 thumbnails。之后,您将拥有一个包含单个元素的数组。

解决方案

将以上行改为:

thumbnails[i] = thumb; // Add to array

这应该可以解决您的问题。

【讨论】:

很晚才看到 net.uk.sweet 已经正确回答了。所以你可能会忽略可能的答案。 ;)【参考方案3】:

对于您认为的问题:

使用向量代替数组 将数组项转换为缩略图类

但主要的罪魁祸首可能是 您从未从数组中清除项目,您将它们从父级/阶段中删除,但您没有将它们从数组中删除......以及在数组中的特定位置会导致不稳定的行为

您添加它们: t[0] = item0_0 t[1] = item0_1 t[2] = item0_2 t[3] = item0_3

然后从阶段中删除 item0_0、item0_1、item0_2、item0_3,但将它们保留在数组中 接下来你添加例如2 个新的

t[0] = item1_0 t[1] = item1_1

所以你有: 舞台上: 项目1_0 项目 1_1 在数组中: t[0] = item1_0 t[1] = item1_1 t[2] = item0_2 t[3] = item0_3

这应该可以工作:

var thumbnails:Vector.<Thumbnail> = new Vector.<Thumbnail>();

function x (e:MouseEvent) 

    var thumb:Thumbnail;

    for each(thumb in thumbnails)
        removeChild(thumb);
    

    thumbnails = new Vector.<Thumbnail>(); // clear Vector by re-initiating it

    for (var i: int = 0;i < userIput; i++) 
        thumb = new Thumbnail();

        // ...

        addChild(thumb);

        thumbnails.push(thumb);
    

【讨论】:

以上是关于删除movieclip子项的动作脚本的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 使用动作脚本将子项添加到舞台

停止动作脚本动画

将动作脚本重写为 javascript

“可能未定义的访问”动作脚本

如何在动作脚本 3 中调整 gif 的宽度和高度

如何从 Flash 中的 MovieClips 中获取多边形?