错误#2025:提供的DisplayObject必须是调用者的子级

时间:2013-03-04 23:54:26

标签: flash runtime-error removechild

我刚开始为一堂课制作一个非常简单的视频游戏,我有一个随机的得分点产生者。这个功能运行正常,没有任何问题,但是当我发布游戏并使用Flashy Player播放时,它会显示错误消息

  

错误#2025:提供的DisplayObject必须是调用方的子级。

我刚刚解雇它,因为除了警报提示之外该程序有效,但我需要删除它。

function spawnscore()
{
    i = 0
    while (i == 0)
    {
        var pointy = Math.random()*640
        var pointx = Math.random()*747

        var pointcirc:warning = new warning();
        addChild(pointcirc);
        pointappearmusic.play();
        setTimeout(removepoint, 1500);
        pointcirc.addEventListener(MouseEvent.MOUSE_OVER, scoreclicked);

        function scoreclicked()
        {
            pointsound10.play();
            removeChild(pointcirc);
            score += 10;
            removeEventListener(MouseEvent.MOUSE_OVER, scoreclicked);
        }

        function removepoint()
        {
            // I'm pretty sure this is the problem
            removeChild(pointcirc);
        }

        pointcirc.x = pointx;
        pointcirc.y = pointy;
        break;
    }

    return;
}

我很确定我的问题出在removepoint函数中,但我无法弄清楚要做什么。

编辑:突出显示错误

2 个答案:

答案 0 :(得分:1)

该错误意味着当它实际上不是该容器的子容器时,您试图从容器中删除DisplayObject,因此看起来正在发生的是scoreclicked()运行并删除pointcirc },然后removepoint尝试再次将其删除。

您只需要检查pointcirc中是否已删除removepoint()。有很多不同的方法可以做到这一点:您可以设置pointRemoved变量,或者在删除后设置pointcirc = null并检查它。您也可以使用DisplayObjectContainer.contains()直接查看,或者查看是否存在pointcirc.parent

答案 1 :(得分:0)

由于错误无害,您可以使用try / catch忽略它:

try
{
    removeChild(pointcirc);
}
catch(e:Error){}

我应该警告你,如果这个while实际上是循环而不仅仅是break,那么你可能不会得到你期望的行为。

pointcirc中的removepoint仅指pointcirc返回spawnscore时的最后一个值。这将是最后一个循环之后的值,这意味着每次调用removepoint时,它都会尝试删除最后一个pointcirc

您可以通过将循环中的代码放入闭包中来避免此问题:

function spawnscore()
{
    i = 0
    while (i == 0)
    {
        var pointy = Math.random()*640
        var pointx = Math.random()*747

        (function(pointcirc:warning)
        {
            var pointcirc:warning = new warning();
            addChild(pointcirc);
            pointappearmusic.play();

            var timeoutId:int = setTimeout(removepoint, 1500);

            pointcirc.addEventListener(MouseEvent.MOUSE_OVER, scoreclicked);

            function scoreclicked()
            {
                pointsound10.play();
                removeChild(pointcirc);
                score += 10;
                removeEventListener(MouseEvent.MOUSE_OVER, scoreclicked);
            }

            function removepoint()
            {
                clearTimeout(timeoutId);
                removeChild(pointcirc);
            }
        })(pointcirc);

        pointcirc.x = pointx;
        pointcirc.y = pointy;
        break;
    }

    return;
}

请参阅http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/