0

AS3 のゲームでエラーが発生しました。配列の長さが 0 の場合、アプリはメニュー シーンに移動する必要があります。ただし、次のようなボックスが常に表示されます: TypeError: Error #2007: Parameter child must be non-null. flash.display::DisplayObjectContainer/removeChild() で kitkat_game_fla::MainTimeline/moveBall()[kitkat_game_fla.MainTimeline::frame2:105]

私はすべてを却下をクリックし、ゲームを再開すると、ボールは完全に速くなります。私は何をすべきか。私の mcBall.x が null であり、そうすべきではないからですか? 私はすでに検索していますが、何も機能しません。助けてください。

これが私のコードです

stop();

    var ballSpeedX:int = 23;//Velocidade em X da bola.
    var ballSpeedY:int = 23;//Velocidade em Y da bola.

    var mySound:Sound = new myFavSong(); 

    var myArray:Array = new Array(mc1,mc2);
    trace (myArray.length);

    function iniciarCode():void{
        mcPaddle.addEventListener(Event.ENTER_FRAME, movePaddle);
        mcBall.addEventListener(Event.ENTER_FRAME, moveBall);
    }

    function movePaddle(event:Event):void{

        var dx:int = mcPaddle.x - mouseX;
        mcPaddle.x -= dx / 5;


        if(mcPaddle.x <= mcPaddle.width/2){ 
            mcPaddle.x = mcPaddle.width/2;
        }else if(mcPaddle.x >= stage.stageWidth-mcPaddle.width/2){
            mcPaddle.x = stage.stageWidth-mcPaddle.width/2; 
        }
    }


    function moveBall(event:Event):void{

        mcBall.x += ballSpeedX;
        mcBall.y += ballSpeedY;

        if(mcBall.x <= mcBall.width/2){
            mcBall.x = mcBall.width/2;
            ballSpeedX *= -1; 

        } else if(mcBall.x >= stage.stageWidth-mcBall.width/2){
            mcBall.x = stage.stageWidth-mcBall.width/2;
            ballSpeedX *= -1;
        }

        if(mcBall.y <= mcBall.height/2){
            mcBall.y = mcBall.height/2;
            ballSpeedY *= -1;

        } else if(mcBall.y >= stage.stageHeight-mcBall.height/2){
            mcBall.y = stage.stageHeight-mcBall.height/2;
            ballSpeedY *= -1;
        }


        if(mcBall.hitTestObject(mcPaddle)){
            calcBallAngle();
        }   
        if(mcBall.hitTestObject(mc_lettering)){
            calcBallAngle();
        }   
        if(mcBall.hitTestObject(mc1)){      
            removeChild(mc1);
            myArray.splice(mc1, 1)
            trace(myArray.length);
            mc1 == null;

        }
        if(mcBall.hitTestObject(mc2)){  
            removeChild(mc2);
            myArray.splice(mc2, 1);
            trace(myArray.length);
            mc2 == null;
        }

        if(myArray.length == 0){
            gotoAndPlay(1,"Menu");
        }

        if(mcBall.hitTestObject(mcPaddle.barra_mc1)){   
            mcPaddle.removeChild(mcPaddle.barra_mc1);
            mcPaddle.barra_mc1 == null;
            mySound.play();

        }




    }

    function calcBallAngle():void{
        var ballPosition:Number = mcBall.x - mcPaddle.x;
        var hitPercent:Number = (ballPosition / (mcPaddle.width - mcBall.width)) - .5;
        ballSpeedX = hitPercent * 30;
        ballSpeedY *= -1;
    }

    iniciarCode();
4

1 に答える 1

2

myArray.splice(mc2, 1);splice()への最初のパラメーターはオブジェクトではなくインデックスであるため、これは間違ったアプローチです。代わりに、そのオブジェクトを照会する必要があります。indexOf()それが既に配列から外れている場合は、スプライスしたり呼び出したりしないでくださいremoveChild()

if (mc1) if (mc1.parent) // if mc1 is detached, why checking hit test?
    if(mcBall.hitTestObject(mc1)){      
        removeChild(mc1);
        myArray.splice(myArray.indexOf(mc1), 1) // at this point mc1 is still in array
        trace(myArray.length);
        // mc1 == null; this is wrong, unless you create a new mc1 at the start of the game
       // and it should spell one equal sign, not two.

    }
if (mc2) if (mc2.parent)
    if(mcBall.hitTestObject(mc2)){  
        removeChild(mc2);
        myArray.splice(myArray.indexOf(mc2), 1);
        trace(myArray.length);
        // mc2 == null;
    }

また、そのようなアプローチは、配列の使用に反します。通常、個々の MC に対してクエリを実行するのではなく、配列を反復処理して、配列hitTestObject内のすべてのアイテムに対して実行します。このような:

for (var i:int=myArray.length-1;i>=0;i--) {
    if (mcBall.hitTestObject(myArray[i])) {
        removeChild(myArray[i]);
        myArray.splice(i,1);
        // that's all
    }
}
if (myArray.length==0) { gotoAndPlay(1,"Menu"); }

また、「シーン」を削除してください。これらは推奨されておらず、奇妙な問題を引き起こす可能性があります。stop()代わりに、1 つのシーンを使用し、タイムライン呼び出しを介してフレーム シーケンスに分割します。

于 2013-10-18T12:29:04.187 に答える