SWF嵌套中的addEventListener

时间:2011-04-29 20:18:04

标签: actionscript-3 actionscript flash uiloader

我目前有一个.swf文件嵌套到另一个.swf文件中。

在父SWF文件中,我使用UILoader加载其他.swf文件。

uiLoader.source =“data / child.swf”;

-

在子SWF文件中我有

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyPressedDown);

当我自己运行它时,它完美地工作;但是当我通过parent.swf stage.addEvent运行child.swf时......给我一个空的引用异常。

舞台是导致问题的原因吗?如果是,有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:2)

好的,这是一个很好的问题,花了一点时间来弄明白。

基本上Flash会做这个奇怪的事情(也许是一个bug?)但是在实际初始化对象之前运行这些函数。只需在舞台上初始化动画片段就会发生这种情况:

var mc:something = new something(); 的addChild(东西)

现在在something.as如果你有一个初始化函数中的一个阶段的引用,它将给出null。 (参考:http://www.emanueleferonato.com/2009/12/03/understand-added_to_stage-event/

所以基本上采取同样的问题并将其扩展到urlLoader,它在实际构建其层次结构阶段之前运行代码 - >电影剪辑

现在为了解决这个问题,请在你的孩子swf中做这样的事情:

import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.display.MovieClip;

addEventListener(Event.ADDED_TO_STAGE, init);


function init(event:Event){
    trace("test");
    stage.addEventListener(KeyboardEvent.KEY_DOWN, moveBox);
    var testMC:test = new test();
    addChild(testMC);
}

function moveBox(event:KeyboardEvent){
    trace("a");
    testMC.x += 11;
}

以上是我的代码,您可以废弃其中的大部分内容,但需要注意的主要事项是: addEventListener(Event.ADDED_TO_STAGE,init); 初始化对象后执行。

答案 1 :(得分:0)

我不完全确定,但可能是因为带有事件监听器的MovieClip嵌套在另一个MovieClip中,它无法访问“stage”对象。

要尝试的一件事是从stage中删除eventListener,所以它看起来像这样:

addEventListener(KeyboardEvent.KEY_DOWN,keyPressedDown);

这可能有用。或者,您可以将事件代码保留在父MovieClip中。希望这些事情可能有所帮助。

得不