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
。总的来说,看看显示列表的基础知识和它是如何工作的。
我已经阅读了 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
。总的来说,看看显示列表的基础知识和它是如何工作的。