0

学校のプロジェクトのためにAS3でゲームを作成していますが、ゲームの再開に追われています。ゲームが終了すると、最終画面が表示され、メニューに戻ることができます。これはすべてうまくいきますが、もう一度プレイしてみると、次のように表示されます。

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/setChildIndex()
at MethodInfo-277()

これをデバッグして、次のコードブロックに移動します。

               if (bringToFront==1){

                    setChildIndex(player,numChildren - 1);
                    setChildIndex(foppeLeft, numChildren - 1);
                    setChildIndex(foppeIdle, numChildren - 1);
                    setChildIndex(foppeRight, numChildren - 1);
                    setChildIndex(foppeDown, numChildren - 1);
                    setChildIndex(foppeUp, numChildren - 1);
                    setChildIndex(foppeTalent, numChildren - 1);
                    setChildIndex(abeIdle, numChildren - 1);
                    setChildIndex(abeUp, numChildren - 1);
                    setChildIndex(abeDown, numChildren - 1);
                    setChildIndex(abeLeft, numChildren - 1);
                    setChildIndex(abeRight, numChildren - 1);
                    setChildIndex(abeSkateIdle, numChildren -1);
                    setChildIndex(abeSkateUp, numChildren - 1);
                    setChildIndex(abeSkateDown, numChildren - 1);
                    setChildIndex(abeSkateLeft, numChildren - 1);
                    setChildIndex(abeSkateRight, numChildren - 1);
                    setChildIndex(abeSkateOn, numChildren-  1);
                    setChildIndex(abeSkateOff, numChildren - 1);
                    setChildIndex(marcoIdle, numChildren - 1);
                    setChildIndex(marcoDown, numChildren - 1);
                    setChildIndex(marcoUp, numChildren - 1);
                    setChildIndex(marcoLeft, numChildren - 1);
                    setChildIndex(marcoRight, numChildren - 1);
                    setChildIndex(marcoJumpUp, numChildren - 1);
                    setChildIndex(marcoJumpIdle, numChildren - 1);
                    setChildIndex(marcoJumpDown, numChildren - 1);
                    setChildIndex(marcoJumpRight, numChildren - 1);
                    setChildIndex(marcoJumpLeft,numChildren - 1);
                    setChildIndex(hudIngame,numChildren - 1);
                    setChildIndex(time,numChildren - 1);
                    setChildIndex(c1000PuP, numChildren - 1);
                    setChildIndex(univePuP, numChildren - 1);
                    setChildIndex(rabobankPuP, numChildren - 1);
                    setChildIndex(frieslandPuP, numChildren - 1);
                    setChildIndex(jakoPuP, numChildren - 1);

                    bringToFront=0;

                }

これをすべて削除することで、実際にはエラーは発生しなくなりましたが、私のゲームでは、atileSheetと配列からレベルを作成しました。次のレベルに進むと、タイルが読み込まれません。最初のレベルが表示されますが、コードは2番目のレベルで機能します。

(私の混沌とし​​たコードを許してください;私はこれに不慣れです。)

コードは2000行以上なので投稿しませんが、少しクリアになるかもしれない部分を投稿します。

最後に到達すると、これが発生します。

        for (var mapEnd in mapsEndArr){
            if (player.hitTestObject(mapsEndArr[mapEnd])){
                if (oneRound==0){
                oneRound=1;
                player.x=0;
                }
            }
        }

        if (oneRound==1){
            //Making sure the arrows & pick up points get deleted when going to another map.

            if (foppeAction == true){

                for (var drawClueEnd in clueArray){
                    removeChild( clueArray[drawClueEnd] );
                }

                if (c1000PuPDrawn==true){
                    c1000PuP.visible=false;
                }

                if (univePuPDrawn==true){
                    univePuP.visible=false;
                }

                if (rabobankPuPDrawn==true){
                    rabobankPuP.visible=false;
                }

                if (frieslandPuPDrawn==true){
                    frieslandPuP.visible=false;
                }

                if (jakoPuPDrawn==true){
                    jakoPuP.visible=false;
                }
                foppeAction = false;
                freeze=0;

            }
            mapNumberY=0;
            mapNumberX=0;   

            mapsUpArr.splice(0, mapsUpArr.length);
            mapsDownArr.splice(0, mapsDownArr.length);
            mapsLeftArr.splice(0, mapsLeftArr.length);
            mapsRightArr.splice(0, mapsRightArr.length);
            wallArrayS.splice(0, wallArrayS.length);
            wallArray.splice(0, wallArray.length);
            iceArray.splice(0, iceArray.length);
            iceBorderArray.splice(0, iceBorderArray.length);
            clueArray.splice(0, clueArray.length);
            pickUpPoint.splice(0, pickUpPoint.length);

            c1000PuPDrawn=false;
            univePuPDrawn=false;
            rabobankPuPDrawn=false;
            frieslandPuPDrawn=false;
            jakoPuPDrawn=false;

            hudBars = new HudBars();
            hudBars.x = 0;
            hudBars.y = 0;
            addChild(hudBars);

            dispatchEvent( new NavigationEvent( NavigationEvent.FINAL ) );

            if (points==0){
                DocumentClass.endScreen.pointsText.text=("Je hebt geen logo's verzamelt.");
            }

            if (points>0 && points<5){
                DocumentClass.endScreen.pointsText.text=("Je hebt "+ points.toString() +"logo('s) verzamelt.");
            }

            if (points==5){
                DocumentClass.endScreen.pointsText.text=("Je hebt alle logo's verzamelt!");
            }

            points=0;

            //Removing all the childs and eventlisteners to clean stuff up in the cleanup function.
            cleanup();

            oneRound=2;

        }

とクリーンアップ:

     function cleanup():void
        {
            removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
            removeEventListener(MouseEvent.MOUSE_DOWN, menuButtonClicked)
            removeEventListener(KeyboardEvent.KEY_DOWN, downKey);
            removeEventListener(KeyboardEvent.KEY_UP, upKey);
            removeEventListener(Event.ENTER_FRAME, loop);
            removeEventListener(Event.ENTER_FRAME, pauseLoop);

            for (var deleteChilds in deleteChildArr){
                removeChild(deleteChildArr[deleteChilds]);
            }

            setToNull();

        }

    }

    function setToNull():void
    {

    myGame=null;

    time=null;

    }

すべてをnullに設定しようとして、少し戸惑いましたが、どこかでそれが発生していないように感じます。何かご意見は?このコードも、ある時点でnullに設定されます。ここで、最後の画面を終了します。

    public function finalScreen():void
    {
        endScreen = new EndScreen();
        endScreen.addEventListener( NavigationEvent.MENU, onRequestMenu );
        endScreen.x = 0;
        endScreen.y = 0;
        addChild(endScreen);

        playScreen=null;

    }

これらのいずれかが貴重な答えにつながることを願っています。さまざまな用語でグーグル検索を行ったところ、ゲームでは、前面に設定する必要のあるムービークリップがまだあるとどういうわけか考えているのに、nullに設定されているために到達できないことがわかりました。

初めてプレイしたときと同じように、すべてをクリアしてから新しいゲームを開始することは可能ですか?

4

1 に答える 1

0

インデックスを削除または変更する前に、子が親にあることを確認する必要があります。

if (this.contains(player))    
    setChildIndex(player,numChildren - 1);
于 2013-01-16T08:16:38.207 に答える