removeChild 当对象离开舞台时。代码有效,但给出错误 #2025 消息

removeChild when object leaves the stage. Code works but gives Error #2025 message

我在尝试移除离开舞台的对象时收到错误消息(错误 #2025:提供的 DisplayObject 必须是调用者的子项。)。

对象在右侧 (stage.width - (enemy.width * -0.5)) 的舞台外生成,向左移动,然后在对象到达某个点时移除。当对象完全离开舞台 (enemy.width * -0.5) 时,我希望这个点在左侧离开舞台,但是每当我使用小于 0 的值时,我都会收到错误消息,或者一次在开始时或无限期取决于我如何编写代码。该代码可以正常运行,但有错误,但我仍然希望它消失。如果我使用 0 值作为移除对象的点,代码运行时不会出错,但注册点需要位于对象的中心,这会在对象完全离开舞台之前将其移除。我发布了我认为与该问题相关的所有代码。

var enemyType:Array = [Enemy1, Enemy2, Enemy3, Enemy4, Enemy5];
var enemyTypeRandomNumber:int = Math.random() * (enemyType.length);
var enemy = new enemyType[enemyTypeRandomNumber];

public function checkEveryFrame(event:Event):void
{
    // remove enemy if it leaves the stage
    //if (enemy.x <= enemy.width * -0.5) // Works but spits out error message every frame.
    //if (enemy.x == enemy.width * -0.5)// Works but gives error only once at the start.
    if (enemy.x == 0) // works but removes the enemy object when it is only half off the screen.
    {
            removeChild (enemy);
    }
}

最好使用 checkEveryFrame 这样的描述性名称。 所以这是重复执行的,每一帧。

这就是答案。

  1. 你的代码第一次运行。
  2. 条件为真。
  3. 移除敌人。
  4. 您的代码再次运行。
  5. 条件(仍然)为真。
  6. 再次移除敌人,但这次失败了,因为它 已经第一时间移除了敌人

要解决此问题,请删除事件的侦听器。 或者将你的敌人存储在一个数组中。 从显示列表中移除时,将其从数组中移除。

在您的函数中,遍历数组(可能有也可能没有 1 个或更多元素)并检查所有元素的条件。

很好地回答了您的问题。

我要补充一点,在尝试删除某个对象之前验证该对象是否在显示列表中通常也是一种好习惯:

if(this.contains(enemy)){
    this.removeChild(enemy);
}

如果你不小心尝试删除一个对象两次,这将防止错误,但我通常认为这是一个故障保护,因为我已经按照 Null 的建议清理了对象及其侦听器。