0

我对 ActionScript 非常陌生。

我想要做的是像这样将位图添加到精灵对象 -

testSprite.addChild(myBitmap);

这会被调用很多次,每次myBitmap可能有不同的 bitmapData。它工作正常,直到这里。然后,每次将myBitmap添加到 sprite 时,我都会尝试将其存储在全局数组中。

BitmapArray.push(myBitmap);

在另一个函数中,我想删除所有这些位图,我正在这样做 -

for each(var currentBitmap:Bitmap in BitmapArray)
{
   testSprite.removeChild(currentBitmap);
}

但是,我收到此错误 -

提供的 DisplayObject 必须是调用者的子对象

谁能告诉我我在这里做错了什么?

4

3 回答 3

2

该错误是指currentBitmap您要从中删除的特定内容当时testSprite不包含在testSprite其中。

在没有看到更多代码的情况下,这可能是由多种原因引起的:

  • 位图从未添加到容器中
  • 位图已添加到testSprite,但随后又添加到了不同的容器中,将其从testSprite进程中移除
  • 您多次将位图添加到 中BitmapArray,这意味着在for each循环中多次尝试删除它(只有第一次会成功)。

一个快速的解决方法是在循环中的每次迭代之前检查是否currentBitmap是子级,如下所示:testSprite

for each(var currentBitmap:Bitmap in BitmapArray)
{
    if (testSprite.contains(currentBitmap))
    {
        testSprite.removeChild(currentBitmap);
    }
}

所以这应该可以规避这个问题 - 但是如果你试图从源头解决问题,如果你期望所有成员BitmapArray都是testSprite.

于 2013-08-29T09:08:11.733 回答
0

您的数组不太可能与您的 testSprite 的显示列表同步。

如果要将位图添加到 testSprite 的显示列表并将其推入 BitmapArray,则在将其从 testSprite 的显示列表中删除时,还必须将其从 BitmapArray 中删除。

确实,您可以在删除时检查它是否被父级包含,并且您也可以指定仅在数组中不存在位图时才将位图推送到数组中。

但是,最好遵循简单的做法,即在添加到显示列表时将其添加到数组中,并在从显示列表中删除时将其从数组中删除。

例如,如果您对这些对象执行的其他操作“假设”它在显示列表中,该怎么办?您是否要在这些区域中添加代码以检查它是否真的在显示列表中,或者数组中是否存在重复项?

这是头痛的秘诀。因此,尽管其他答案确实确实解决了眼前的问题,但它实际上只是导致不良实践和更大头痛的秘诀。

于 2013-08-29T20:01:43.473 回答
0

正如您所说,您可以多次将 myBitmap 添加到 BitmapArray。因此,当您在循环中删除子项时,假设 myBitmap 出现在索引 0 和索引 1 处。在您删除索引 0 处的 myBitmap 并尝试在索引 1 中删除它之后,它会给您一个错误,因为 myBitmap 不是 testSprite 的子项不再。

testSprite  = [myBitmap, myBitmap].

所以有两种解决方案

第一的

当您将项目添加到 BitmapArray 时,请使用 indexOf 函数检查该项目是否存在于 BitmapArray 中。

BitmapArray.indexOf(item)

第二

当您从 testSprite 中删除子项时,请检查 testSprite 是否包含该子项

if (testSprite.contains(currentBitmap)) {
    testSprite.removeChild(currentBitmap);
}
于 2013-08-29T09:13:05.963 回答