我对ActionScript非常陌生。
我要做的是将位图添加到sprite对象,如下所示 -
testSprite.addChild(myBitmap);
这会被多次调用,每次 myBitmap 可能有不同的bitmapData。 它工作正常,直到这里。然后我尝试在每次添加到精灵时将 myBitmap 存储在全局数组中。
BitmapArray.push(myBitmap);
在另一个函数中,我想删除所有这些位图,我这样做 -
for each(var currentBitmap:Bitmap in BitmapArray)
{
testSprite.removeChild(currentBitmap);
}
但是,我收到此错误 -
提供的DisplayObject必须是来电者的子女
有谁能告诉我我在这里做错了什么?
答案 0 :(得分: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
的所有成员都是{{{1}的孩子,那么它可能会使后续工作更容易。 1}}。
答案 1 :(得分:0)
正如您所说,您可以多次将myBitmap添加到BitmapArray。所以当你在循环中删除child时,假设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);
}
答案 2 :(得分:0)
您的数组不太可能与testSprite的显示列表同步。
如果要将位图添加到testSprite的显示列表并将其推入BitmapArray,则必须在从testSprite的显示列表中删除它时将其从BitmapArray中删除。
确实,您可以在删除时检查父项是否包含它,并且如果数组中尚不存在位图,则指定仅将位图推送到数组中也是如此。
但是,最好按照添加到显示列表时将其添加到数组中的简单做法,并在从显示列表中删除数组时将其从数组中删除。
例如,如果您正在对这些对象进行其他操作,并假设它出现在显示列表中,该怎么办?您是否要在这些区域添加代码以检查它是否真的在显示列表中,或者数组中是否有重复?
这是头疼的秘诀。因此,虽然其他答案确实可以解决当前的问题,但它实际上只是一种不良做法和更大问题的处方。