0

私はクラスのために本当にシンプルなビデオゲームを作り始めたばかりで、ランダムなスコアポイントスポナーを持っています。この機能は正常に動作し、問題はありませんが、ゲームを公開して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関数にあると確信していますが、どうしたらよいかわかりません。

編集:ハイライトエラー

4

2 に答える 2

1

このエラーは、コンテナが実際にはそのコンテナの子ではないときに、コンテナからを削除しようとしていることを意味します。したがって、実行されて削除された後、再度削除しようとしてDisplayObjectいるように見えます。scoreclicked()pointcircremovepoint

pointcircですでに削除されている かどうかを確認する必要がありますremovepoint()。これを行うには、さまざまな方法があります。pointRemoved変数を設定することも、pointcirc = null削除した後で設定して確認することもできます。を使用して直接確認することも、存在するDisplayObjectContainer.contains()かどうかを確認することもできpointcirc.parentます。

于 2013-03-05T00:08:53.787 に答える
0

エラーは無害なので、try/catchで無視できます。

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

whileこれが最後に実行するのではなく実際にループbreakする場合は、期待した動作が得られない可能性があることを警告する必要があります。

pointcircinは、返されたときremovepointの最後の値のみを参照します。これは最後のループの後の値になります。つまり、が呼び出されるたびに、最後のループを削除しようとします。pointcircspawnscoreremovepointpointcirc

ループ内のコードをクロージャーに入れることで、この問題を回避できます。

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/を参照してください

于 2013-03-05T00:48:26.517 に答える