2011-04-12 45 views
1

好的,所以我试图弄清楚何时将一个孩子添加到动画片段“x”中,并在此“x”动画片段内处理/绕开此操作。检测对象何时添加到动画片段

我试着重写addChild和addChildAt,以no为准。通过Flash放置在舞台上的影片剪辑仍然不会触发addChild或addChildAt。但是,跟踪this.numChildren正确显示'2'。

任何提示?

回答

1

您可以通过执行以下操作重写影片剪辑的默认方法:

创建课程以扩展动画片段:

package { 
    import flash.display.*; 

    public class SuperMovieClip extends MovieClip { 

     public function SuperMovieClip() { 
      // constructor code 
      super(); 
     } 

     override public function addChild(child:DisplayObject):DisplayObject { 
      trace("Hello, I am overriding add child"); 
        // still perform the default behavior but you can do what ever you want. 
      return super.addChild(child);      
     } 

    } 

} 

然后在Flash中创建一个新的动画片段,并确保它标记为对ActionScript启用。类应该是你想要的任何名称,但基类必须SuperMovieClip(或者你选择了你扩展的类名)查看图片:

enter image description here

现在,当创建了该基地的任何阶段剪辑类型(无论它是在IDE中还是通过代码),它将是SuperMovieClip类型,并随时调用addChild它将覆盖原始函数。

例如,我在设计时放置在此MC的实例从库到台上,并使用在时间轴上下面的代码编译它:

import flash.display.Sprite; 

stage_mc.addChild(new Sprite()); 

它输出Hello, I am overriding add child

+0

好的,这里是我想我在问题中遗漏的内容:我想要监视的类是Flash的文档类。因此,当从闪存IDE编译FLA文件时,会添加时间线上的所有剪辑。这些是我想找到的。覆盖文档类的addChild方法完全不起作用;它永远不会被调用。 – Qix 2011-04-12 21:30:58

+0

好吧,这将是理想的答案,但我意识到时间线上的影片剪辑首先添加到舞台上(您无法重写),然后添加到文档类实例(这真的很奇怪)。我只是将所有实例关联到扩展MovieClip的单个类,然后将其注册到文档类中。这是一个非常迂回的做事方式,但它的工作。 – Qix 2011-04-13 03:45:57

2

您可以为x影片剪辑的“已添加”事件添加事件侦听器。

x.addEventListener(Event.ADDED, addHandler); 

function addHandler(e:Event){ 
// your code here 
} 

此链接可能更好地解释它: AS3.0 – Event.ADDED and Event.ADDED_TO_STAGE

文档也是一个很好的资源: flash.events.Event

+1

虽然正确,它不会检测x何时添加了某些东西,而是会检测它本身何时添加到某个东西。当然,除非我误解了原始问题 – Chris 2011-04-12 08:43:38

+0

否,当您想要追踪何时添加容器时,而不是在何时添加子容器时。 – Qix 2011-04-12 21:31:42