Flash AS3 - 从子级到父级时间轴的事件

时间:2010-09-09 00:35:54

标签: flash actionscript-3 event-handling air

我想做的事情似乎很简单,但是我想要在Flash的时间轴内工作,而不是在自定义类,.as文件,flex等中工作,这让我很困惑。我是一名艺术家,并且代码只能作为我的资产(在Flash中创建/动画)重用,所以我倾向于在时间轴中工作。

我希望在孩子的时间轴末尾有一个脚本来推进其父级的时间轴。如果这是一个真正的AS3脚本,这样的东西就会出现在孩子的最后一帧:this.parent.gotoAndPlay(2);

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

  

导入customClass; if(Boolean = true){gotoAndPlay(3);} //等待孩子

父框架2上的

  

的gotoAndPlay(1); //这会创建廉价的循环

并在最后一个子框架上:

  

导入customClass; Boolean = true //告诉父母何时离开其循环

这有效,但显然不是最好的方法......我需要的是在同一时间轴帧内递归,但没有堆栈溢出或编号增量。

我怀疑答案在于EventListeners,但我不想用MouseClick或Timer触发它,我想像这样触发它:new EventListener:EventListener(ThatGlobalVarAtTheEndOfYourChildTimelineHasBeenChanged);然后,当布尔值变为true时,它会进展。

我确信这很简单,我觉得这是一个白痴问这么简单的事情,但所有的文档都让我在舞台上工作,或者我在代码中创建的对象中有一个对象,但它不是那样的我想做的很容易,因为我正在制作使用多个时间轴的复杂动画。 Flash知道哪个对象属于什么,而不是我或我的类。

感谢任何人的帮助。

1 个答案:

答案 0 :(得分: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...
   }
}

我个人会使用自定义事件,我可以传递子项的实例名称以及在主时间轴中需要的任何属性来触发新函数。孩子可以派遣事件,但我赞成使用root作为前端控制器。