0


我开始编写 Flash 射击游戏教程并完成了Asgamer Shoot em upp Game
现在我开始创建一个新的 .fla 文件,它是主菜单,我有一个播放按钮,所以当我按下它时,它会加载 .fla 文件。 swf(Game swf) 但是当我按下按钮时出现以下错误。

TypeError: Error #1009: Cannot access a property or method of a null object reference.
 -at com.senocular.utils::KeyObject/construct()
 -at com.senocular.utils::KeyObject()
 -at com.actionscript.Ergasia::Ship()
 -at com.actionscript.Ergasia::Engine()





public function Engine() : void {
    if(stage) {
        initialize();
    } else {
        addEventListener(Event.ADDED_TO_STAGE,initialize);
    }
} 

    private function initialize(e:Event = null):void {
        removeEventListener(Event.ADDED_TO_STAGE,initialize);
        //  here goes the code that's currently in Engine constructor
    }

编辑:感谢 Viper 解决了这个问题!

4

1 回答 1

0

将构造函数更改Engine为以下内容:

public function Engine() {
    if(stage) {
        initialize();
        } else  addEventListener(Event.ADDED_TO_STAGE,initialize);
    } 

private function initialize(e:Event = null):void {
    removeEventListener(Event.ADDED_TO_STAGE,initialize);
    //  here goes the code that was in Engine constructor
    trace(stage);
        ourShip = new Ship(stage);
        stage.addChild(ourShip);
        ourShip.x = stage.stageWidth / 2;
        ourShip.y = stage.stageHeight / 2;
        ourShip.addEventListener("hit", shipHit, false, 0, true);
        stage.addChild(ourShip);
        scoreHUD = new ScoreHUD(stage);
        stage.addChild(scoreHUD);

        for (var i:int = 0; i < numCloud; i++)
        {
            stage.addChildAt(new Cloud(stage), stage.getChildIndex(ourShip));

        }
        for (var b:int = 0; b < numStar; b++)
        {
            stage.addChildAt(new Star(stage), stage.getChildIndex(ourShip));
        }

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

主要问题是您的Engine类是在假定stage已经可以访问的情况下编写的,但是当您加载 SWF 时,它stage是空的,而 SWF 没有添加到阶段。为了避免这种情况,通常的做法是使用Event.ADDED_TO_STAGE侦听器,然后开始将代码放在其中而不是构造函数中。

于 2013-04-26T08:02:13.717 回答