1

AS3 でゲームを作成し、ファイルとして 2 つ持っています。1 つは HWMain と HWGame です。開始ボタンをクリックすると、スクリプトは HWMain から HWGame に切り替わりますが、このエラーが発生しました。

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at HWGame()
at MethodInfo-26()
at MethodInfo-25()

これが私のコードです。

public class HWGame extends MovieClip
{
    var INIT_STATE:String = "INIT_STATE";
    var READY_STATE:String = "READY_STATE";
    var PLAYER_STATE:String = "PLAYER_STATE";
    var PLAY_STATE:String = "PLAY_STATE";
    var END_STATE:String = "END_STATE";
    var gameState:String;

    //And another variable

    public function HWGame()
    {
        gameState = INIT_STATE;
        trace(gameState);
        stage.addEventListener(Event.ENTER_FRAME, gameLoop);

        function gameLoop(e:Event):void
        {
            switch (gameState)
            {
                case INIT_STATE :
                    initGame();
                    break;
                case READY_STATE :
                    ready();
                    break;
                case PLAYER_STATE :
                    startPlayer();
                    break;
                case PLAY_STATE :
                    playGame();
                    break;
                case END_STATE :
                    endGame();
                    break;
            }
        }

        function initGame():void
        {
            //I write the long code
        }

        function ready():void
        {
            //I write the long code
        }

        function startPlayer():void
        {
            //I write the long code
        }

        function playGame():void
        {
            //I write the long code
        }

        function endGame():void
        {
            //I write the long code
        }
    }
}

私はそれを修正しようとしましたが、エラーは gameState = INIT_STATE にあると思います。私は何をすべきか?

ありがとう。

4

1 に答える 1

0

引用したことから、HWGameインスタンスがまだ表示リストに追加されていない可能性があります。したがって、次stagenullように呼び出します。

stage.addEventListener(Event.ENTER_FRAME, gameLoop);

にアクセスする前stageに、ステージに追加されるまで待つことができます:

package
{
    import flash.display.MovieClip;
    import flash.events.Event;

    public class HWGame extends MovieClip
    {

        var INIT_STATE:String = "INIT_STATE";
        var READY_STATE:String = "READY_STATE";
        var PLAYER_STATE:String = "PLAYER_STATE";
        var PLAY_STATE:String = "PLAY_STATE";
        var END_STATE:String = "END_STATE";
        var gameState:String;

        public function HWGame()
        {
            gameState = INIT_STATE;

            addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
        }

        protected function addedToStageHandler(event:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);

            stage.addEventListener(Event.ENTER_FRAME, gameLoop);
        }

        protected function gameLoop(e:Event):void
        {
            switch (gameState)
            {
                case INIT_STATE:
                    initGame();
                    break;
                case READY_STATE:
                    ready();
                    break;
                case PLAYER_STATE:
                    startPlayer();
                    break;
                case PLAY_STATE:
                    playGame();
                    break;
                case END_STATE:
                    endGame();
                    break;
            }
        }

        protected function initGame():void
        {
            //I write the long code
        }

        protected function ready():void
        {
            //I write the long code
        }

        protected function startPlayer():void
        {
            //I write the long code
        }

        protected function playGame():void
        {
            //I write the long code
        }

        protected function endGame():void
        {
            //I write the long code
        }
    }
}
于 2012-07-30T06:43:20.043 に答える