0

我在这个类中有一个文档类,我动态创建影片剪辑,将它们存储在一个数组中,最后使用 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
        }
    }
4

3 回答 3

1

当您MovieClip从中检索 时Array,您需要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]));

        }

    }

或者,您可以考虑使用基本类型设置为的Vector(类型安全版本) :ArrayDisplayObject

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

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

如需进一步阅读,请查看有关类型转换的 Adob​​e 文档和Vectors.

更新:

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

// 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);
于 2012-08-20T09:04:09.370 回答
1

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

为什么会发生这种情况

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

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

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

解决方案

将上面的行更改为:

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

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

于 2012-09-01T10:18:39.403 回答
0

对于您认为的问题:

使用 Vector 而不是 Array 将数组项转换为 Thumbnail 类


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

你添加它们:
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

所以你有:
在舞台上:
item1_0
item1_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);
    }
}
于 2012-08-20T21:58:00.567 回答