0

ゲームを一時停止するコードがあり、次のように一時停止機能を実行します。

public function onKeyPress(keyboardEvent:KeyboardEvent) :void
{
    //Check for pause
    if(keyboardEvent.keyCode == Keyboard.P)
    {
        //If the timer is still running
        if(gameTimer.running)
        {
            gameTimer.stop();
            Mouse.show();
            pauseText = new PauseText();
            pauseText.x = 150;
            pauseText.y = 100;
            addChild(pauseText);
            //If the player is using the mouse, resume by clicking on the player
            if(mouseControl)
            {
                player.addEventListener(MouseEvent.CLICK, resumeGame);
                pauseText.pauseInformation.text = "click on yourself";
            }
            else
            {
                pauseText.pauseInformation.text = "press 'p'";
            }
        }
        else
        {
            //Only allow the player to resume with P IF he is using the keyboard
            //This prevents cheating with the mouse.
            if(!mouseControl)
            {
                gameTimer.start();
                removeChild(pauseText);
                pauseText = null;
            }
        }
    }
}

ゲームは完全に正常に実行されます。私の最初のプレイスルーでは、一時停止機能が機能します。ただし、後で死んでゲームを再開し、一時停止すると、次のメッセージが表示されます。

TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/removeChild()
    at Game/onKeyPress()

それでもゲームは問題なく動きます。ただし、一時停止または一時停止解除するたびに、このエラーが表示されます。私が再び死んだ場合、再起動してから一時停止すると、これらのエラーのうちの 2 つが表示されます。私が収集できることから、それはpauseTextを削除しようとしているように見えます...しかし、最初のプレイスルーで問題なく削除していました.removeChild()を使用してから、コードの他の部分にnullを設定しましたが、動作します大丈夫。さらに、trace(“a”); を追加すると、関数ヘッダーの直後のステートメントで、出力パネルに「a」が表示される前にエラーが発生します。

どうしたの?

追加メモ: 最初のプレイスルーで一時停止機能をまったく使用しない場合、2 回目のプレイスルーで呼び出してもエラーは発生しません。

4

3 に答える 3

0
if (!mouseControl) {
    gameTimer.start();
    if (pauseText && contains(pauseText)) {
        removeChild(pauseText);
        pauseText = null;
    }
}
于 2012-08-27T11:04:08.230 に答える
0

前のゲームのイベント リスナーを削除せずに、別のゲーム オブジェクト (ゲーム全体を含むオブジェクト) をインスタンス化する可能性があります。複数の KeyboardEvent.KEY_DOWN リスナーがアクティブになっているため、このような動作を説明できます。また、ゲームを停止するときは、タイマーを停止する可能性が最も高いことに注意してください。したがって、「if (gameTimer .running)" ステートメントが実行されますが、pauseText が生成されずにタイマーが事実上停止しました。だから、あなたは逃します

removeEventListener(KeyboardEvent.KEY_DOWN,onKeyPress);

あなたのゲーム破壊コードで。

于 2012-08-27T09:56:37.143 に答える
0

removeChild を 'if' に入れると、エラーが解決されます:

if(pauseText.parent){
    pauseText.parent.removeChild(pauseText);
}

しかし、とにかく問題の原因を確認する必要があります。開始時に「gameTimer.running」がfalseになっている可能性がありますか?

于 2012-08-27T06:54:53.803 に答える