Actionscript 3 在数组中存储位图的问题

Actionscript 3 在数组中存储位图的问题,actionscript-3,bitmap,Actionscript 3,Bitmap,我对ActionScript非常陌生 我想做的是向精灵对象添加位图,如下所示- testSprite.addChild(myBitmap); 这会被多次调用,每次myBitmap都可能有不同的bitmapData。 到这里为止一切都很好。然后,每次将myBitmap添加到sprite时,我都尝试将其存储在全局数组中 BitmapArray.push(myBitmap); 在另一个函数中,我想删除所有这些位图,我是这样做的- for each(var currentBitmap:Bitmap

我对ActionScript非常陌生

我想做的是向精灵对象添加位图,如下所示-

testSprite.addChild(myBitmap);
这会被多次调用,每次myBitmap都可能有不同的bitmapData。 到这里为止一切都很好。然后,每次将myBitmap添加到sprite时,我都尝试将其存储在全局数组中

BitmapArray.push(myBitmap);
在另一个函数中,我想删除所有这些位图,我是这样做的-

for each(var currentBitmap:Bitmap in BitmapArray)
{
   testSprite.removeChild(currentBitmap);
}
然而,我得到了这个错误-

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


有人能告诉我我在这里做错了什么吗?

错误是指您试图从
testSprite
中删除的特定
currentBitmap
此时不包含在
testSprite

在看不到更多代码的情况下,这可能是由多种原因造成的:

  • 位图从未添加到容器中
  • 位图已添加到
    testSprite
    ,但随后添加到另一个容器中,并在该过程中将其从
    testSprite
    中删除
  • 您多次将位图添加到
    BitmapArray
    ,这意味着在每个
    循环的
    中都有多次尝试将其删除(只有第一次会成功)
一个快速修复方法是在循环中每次迭代之前检查
currentBitmap
是否是
testSprite
的子对象,如下所示:

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

因此,这应该可以避免这个问题-但是如果您试图从源代码处解决问题,如果您希望
BitmapArray
的所有成员都是
testSprite

的孩子,那么后续的工作可能会更容易。正如您所说,您可以多次将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);
}

您的阵列可能与testSprite的显示列表不同步

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

确实,您可以在删除位图时检查它是否包含在父级中,并且如果位图在数组中尚不存在,则指定仅将其推入数组也是如此

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

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


这是头痛的秘诀。因此,虽然其他答案确实解决了眼前的问题,但这实际上只是一个坏习惯和更大麻烦的配方。

无论您对同一项调用addChild()多少次,它都会被添加一次,并且您只需要/可以-删除一次。如果需要检查DisplayObject(即位图)是否是DisplayObjectContainer(即sprite)的子对象,请使用contains(DisplayObject)方法,或者检查DisplayObject.parent==DisplayObjectContainer