2011-04-29 68 views
1

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

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

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

-

在子SWF文件我有

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyPressedDown);

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

是什么导致问题的阶段部分?如果是的话,有没有办法解决这个问题?

+0

stage.addEvent ...你是在孩子还是父母身上跑步? – 2011-04-29 21:45:25

回答

2

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

基本上Flash做这个奇怪的事情(也许是一个bug?),但在实际初始化对象之前运行函数。这种情况发生在初始化舞台上的movieclip时:

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); 在对象初始化后执行。

+0

谢谢,那正是我所需要的。 – triangulito 2011-05-02 16:10:01

+0

@triangulito你可能想要在.as上编码,而不是在一个框架上,在这种情况下,我认为你可以使用一个自定义的调度器,这将允许抽象,你可以从任何地方执行它。 – Saad 2011-05-03 01:03:27

+0

是的,我正在研究一个主要由设计人员完成的项目,他们很难让他们过渡到类而不是框架编程,所以我只是一直到我们开始一个新项目。 – triangulito 2011-05-03 17:56:03

0

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

有一点尝试,会从舞台中删除事件监听,因此它只是看起来像这样:

addEventListener(KeyboardEvent.KEY_DOWN,keyPressedDown); 

可能的工作。或者,您可以将事件代码保留在父级影片剪辑中。希望这些东西可能有所帮助

德布