删除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]));
或者,您可以考虑使用Vector
(Array
的类型安全版本)并将基本类型设置为DisplayObject
:
var thumbnails:Vector.<DisplayObject> = new Vector.<DisplayObject>();
thumbnails.push(new MovieClip());
this.addChild(thumbnails[0]);
this.removeChild(thumbnails[0]);
如需进一步阅读,请查看 type conversion 和 Vectors
上的 Adobe 文档。
更新:
下面的行实际上是在您的缩略图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子项的动作脚本的主要内容,如果未能解决你的问题,请参考以下文章