2010-09-09 75 views
0

我想做的事情似乎很简单,但被我想要在Flash的时间轴内工作的事实所迷惑,而不是在自定义类,.as文件, flex等。我是一名艺术家,代码只能像我的资源一样可重用(在Flash中创建/动画),所以我倾向于在时间轴上工作。Flash AS3 - 从孩子到父母时间线的活动

我想在孩子的时间线结束时有一个脚本,它的父代的时间线进度。如果这是一个真正的AS3脚本,那么类似这样的东西将会在孩子的最终框架上:this.parent.gotoAndPlay(2);

我已经完成了可以工作的“修复”,但是将我的程序放慢到了不可接受的速度。例如:我将在导入的自定义类中保存一个公共静态布尔值,并在父帧1上拥有一个“侦听器”:

import customClass;如果(布尔=真){的gotoAndPlay(3);} //父框架2上等待子

的gotoAndPlay(1); //这将创建便宜环

和最后一个子帧:

进口customClass;布尔= TRUE //告诉父母时留下的环

这工作,但显然不是最好的办法......我需要的是同一个时间轴帧中的递归,但没有一个堆栈溢出或编号增量。我想怀疑是EventListeners的答案,但我不想用MouseClick或Timer触发它,我想这样触发它:new EventListener:EventListener(ThatGlobalVarAtTheEndOfYourChildTimelineHasBeenChanged);然后当布尔变为true时它会进展。我确定这很容易,我觉得自己像一个白痴问这么简单,但所有的文档都让我在舞台上工作,或者用我在代码中创建的对象内的对象,但它不是这很容易与我想做的事情,因为我正在制作使用多个时间轴的复杂动画。 Flash知道哪些对象在什么范围内,而不是我或我的课程。

谢谢任何​​人的帮助。

回答

1

主要时间表可以发送和收听活动并将相关信息发送给相关的孩子。

在一个子实例中,你可以写。

 
var dispatcher:MovieClip = this.root as MovieClip; 
dispatcher.dispatchEvent(new Event('last frame reached')); 

,并在主时间轴

 
this.addEventListener("mc1 last frame reached" , eventListener); 

function eventListener(event:Event):void 
{ 
    //should return your event name 
    trace(event.type); 

    //you could use a switch statement to redirect to a specific function 

    switch(event.type) 
    { 
     case "mc1 last frame reached": 
      this.instanceName1.instanceName2.gotoAndPlay(n); 
      break; 

     case "mc2 last frame reached": 
      this.instanceName1.instanceName4.gotoAndPlay(n); 
      break; 

     ///etc... 
    } 
} 

我会亲自使用自定义的事件,在那里我可以通过孩子和任何性质的实例名称我需要在主时间轴触发新功能。孩子可以派发事件,但我赞成使用根作为前端控制器。

+0

这将是干净的做法..我认为,虽然,在主要时间线上,它应该是孩子。addEventListner(...) – Ben 2010-09-09 02:34:07

+0

实际上,root代表flash中最顶层的对象..子实例可以调用它自己的dispatchEvent方法(并执行child.addEventListener) – Ben 2010-09-09 02:35:37

+0

我使用根作为前端控制器,所以this你有一个调度员,这让我意识到我实际上在我上次编辑中犯了一个错误... – PatrickS 2010-09-09 02:40:52