在阵列问题中存储位图

时间:2013-08-29 08:29:38

标签: actionscript-3 bitmap

我对ActionScript非常陌生。

我要做的是将位图添加到sprite对象,如下所示 -

testSprite.addChild(myBitmap);

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

BitmapArray.push(myBitmap);

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

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

但是,我收到此错误 -

  

提供的DisplayObject必须是来电者的子女

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

3 个答案:

答案 0 :(得分:2)

该错误指的是您当前currentBitmap中未包含您testSprite中要删除的特定testSprite的事实。

没有看到更多的代码,这可能是由许多事情引起的:

  • 该位图从未添加到容器
  • 位图已添加到testSprite,但后来添加到其他容器中,并在此过程中将其从testSprite中删除
  • 您将位图多次添加到BitmapArray,这意味着在for each循环中有多次尝试删除它(只有第一次会成功)。

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

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中删除。

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

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

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

这是头疼的秘诀。因此,虽然其他答案确实可以解决当前的问题,但它实际上只是一种不良做法和更大问题的处方。