SWF Loader -> TypeError: Error #1009 (Null reference)

SWF Loader -> TypeError: Error #1009 (Null reference)

我已经阅读了 SO 之前的帖子,似乎有些人和我有同样的问题 - 但 none 想出了一个解决我的问题的方法:)

我设计了 3 个游戏,它们都是自己的 SWF 文件,我试图在容器程序中通过按键加载它们,有点像 :)。

虽然我的所有 SWF 文件都出现 TypeError 1009 空引用 :( 并且当我从 Windows 加载它们时它们 运行 完美。我已经尝试加载由其他人,这确实奏效了。所以也许我设计 Flash 游戏的方式有点偏离? 一切都发生在第 1 帧 - 这可能是错误的。

我的加载程序代码是:

stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeysDown);

function loaderFunction(swfFile:String):void {
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
    loader.load(new URLRequest(swfFile));
}

function onComplete(e:Event):void {
    var movie:* = LoaderInfo(e.currentTarget).content;
    //Adding content to the stage
    stage.addChild(movie);
}


function reportKeysDown(event:KeyboardEvent):void 
{ 
    if(event.keyCode == Keyboard.NUMBER_1) {
        stage.removeChildren(1);
        loaderFunction("Card.swf");
    }
    if(event.keyCode == Keyboard.NUMBER_2){
        stage.removeChildren(1);
        loaderFunction("Puzzle.swf");
    }
    if(event.keyCode == Keyboard.NUMBER_3){
        stage.removeChildren(1);
        loaderFunction("BallGame.swf");
    }
}

错误是

TypeError: Error #1009: Cannot access a property or method of a null object reference. at BallGame_fla::MainTimeline/frame1()

(我为所有 SWF 的人准备了这些)

我不确定如何调试我正在加载的那些游戏,因为当我单独玩时没有任何问题。 有任何想法吗 :)?谢谢!

编辑: 它开始告诉我哪些线路出了问题,它似乎是键盘监听器,至少对于其中一款游戏来说是这样。我正在读入键盘,就像我在使用加载程序 swf 一样。

stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);

解决方案-编辑: 问题是加载的 SWF 使用 "stage" 属性,当它们加载到另一个 SWF 时,舞台不属于他们。这就是导致错误的原因:) @BotMaster

解决方案-解决方案编辑: 如果您使用

Event.ADDED_TO_STAGE

比如这样:)

this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
function onAdded(e:Event):void{
    trace("added");
    stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); 
}

@null

stage 仅在 DisplayObject 添加到显示列表时才可用(而不是 null)。

该规则的唯一例外是主文件或在 Flash 播放器中打开的第一个文件。 这就是为什么您的每个游戏都可以单独玩的原因。

如果可用,您应该只使用 stage 属性。为此,请监听 Event.ADDED_TO_STAGE 事件。当有东西被添加到舞台上时,这将被调度。在处理函数中,您可以安全地使用 stage.

您仍然应该将侦听器添加到 stage,但前提是它对您可用。


请阅读有关 addChild() 的文档。你基本上应该 永远不会 添加任何东西到 stage。总的来说,看看显示列表的基础知识和它是如何工作的。