3

ゲームでムービークリップを制御できるクラス Catcher があります。ゲームが終了して再起動できるように、ゲームをプログラムしようとしています。そのため、すべてを削除してメニューに戻る必要があります。解決するのは簡単なことですが、方法がわかりません。

これまでのところ、私は ourCatcher.parent.removeChild(ourCatcher); を持っています。ステージからムービークリップを削除します。そして、ステージに物をドロップする関数の 1 つを停止する if ステートメント。SoundMixer.stopAll(); 音楽を停止します。次に、ゲームオーバー画面であるフレーム 3 に移動します。

問題ないように見えますが、エラー コンソールに常に 1009 エラーが表示され、ゲームを再起動すると非常に遅くなります。Catcher がステージから削除され、現在は null であるため、Catcher 内で移動するための関数がまだ実行されており、エラーが発生しているようです。

キャッチャーに関係するすべてのことを参照解除する必要があることはわかっていますが、私の状況でそれを行うためのドキュメントをオンラインで見つけることができません。誰もがさまざまな方法を持っているようですが、私が試してみましたがうまくいきません。

キャラクターを動かすために使用している Catcher クラスの 2 つの関数:

public function Catcher(stageRef:Stage) 
    {
        stop();
        this.stageRef = stageRef;
        key = new KeyObject(stageRef);


        addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
    }

    //movement
    public function loop(e:Event):void
    {           
        if (key.isDown(Keyboard.A))
                vx -= walkSpeed;

        else if (key.isDown(Keyboard.D))
                vx += walkSpeed;

        else
                vx *= friction;

        //update position
        x += vx;

        //speed adjustment
        if (vx > maxspeed)
            vx = maxspeed;
        else if (vx < -maxspeed)
            vx = -maxspeed;

        //stay inside screen
        if (x > stageRef.stageWidth)
        {
            x = stageRef.stageWidth;
            vx = -vx
        }

        else if (x < 0)

        {
            x = 0;
            vx = -vx;
        }


        if (key.isDown(Keyboard.A))
        {
            scaleX = -1;
        }

        else if (key.isDown(Keyboard.D))
        {
            scaleX = 1;
        }

        movement();

        // Jumping
        jump += gravity;

        if (y > stage.stageHeight /1.5)
        { 
            jump = 0;
            canJump = true;
        }

        if (key.isDown(Keyboard.SPACE) && canJump)
        {
            jump = -10;
            canJump = false;
        }

        y += jump;


    }

ステージから物を取り除くもう 1 つのクラスは CatchingGame と呼ばれ、オブジェクトをドロップする関数があります。playerlives == 0 の場合にゲーム オーバー コードを配置します。

if (playerLives == 0 )
                {
                stop();
                ourCatcher.parent.removeChild(ourCatcher);
                SoundMixer.stopAll();
                gotoAndStop(3);
                }

これが私の最初のフラッシュ ゲームなので、おそらく初歩的なミスを犯した可能性があります。これは私のゲームを完成させるための最後のステップであるため、どんな助けも大歓迎です.

4

2 に答える 2

0
if (ourCatcher.parent) ourCatcher.parent.removeChild(ourCatcher);
else trace("Catcher without a parent still plays! DEBUG THIS!");

基本的に、キャッチャーの制御フローを失う可能性が最も高いです。つまり、キャッチャーはステージから2回自分自身を削除しようとしているようです。それが最初にそれ自体を削除した後parent、それはヌルになり、したがって1009になります。そして、あなたが2028を打ったのを見ると、同じ理由が当てはまり、あなたのキャッチャーはもはやどこの子でもありません。

于 2012-12-05T15:05:10.150 に答える
0

親を参照して子自体を削除するだけでなく、子を削除するのではなく (これが実際に機能することを確認するためにテストする必要がありました)。最初に eventListener ENTER_FRAME を削除し、次に Catcher を削除する Catcher を作成/インスタンス化するのと同じ場所に関数を作成します。

if (playerLives == 0 ) {
  stop();
  removeCatcher();
  SoundMixer.stopAll();
  gotoAndStop(3);
}

// new location in the main code where the catcher is created
function removeCatcher():void {
  ourCatcher.cleanUp();
  removeChild(ourCatcher);
}

// in the Catcher class
function cleanUp():void {
  removeEventListener(Event.ENTER_FRAME, loop);
}
于 2012-12-05T14:08:12.143 に答える