是否首选使用addFrameScript将动作与时间轴分离?

时间:2011-10-19 08:43:04

标签: flash actionscript-3 actionscript

在MovieClip类的一部分中有一个未记录的addFrameScript方法。显然有些人使用该方法省略在时间轴中的帧内编写任何代码,并将所有代码放在一个单独的.as文件中(例如Maintimeline.as)。

当你将代码与它们分离并将它们放在另一个文件中时,我觉得实际的框架及其中的形状和对象会失去它们的物理意义。

这种方法是否是首选的,是否有任何实际的例子,通常这样做?

4 个答案:

答案 0 :(得分:2)

总是更喜欢从代码中分离图形。 MovieClip中唯一允许的代码可能是stop()命令,但最好还是解决这个问题。

就个人而言,我不使用addFrameScript()因为我发现将图形与特定类关联起来更容易(通过在Flash中导出它,或者创建一个类并将MovieClip添加为属性)。如果图形或代码发生变化,使用起来会更清晰,站起来会更好。

答案 1 :(得分:2)

我尽量避免在时间轴上编写任何代码,因为它们使得事情变得非常难以理解:

  • 框架无需添加/删除代码
  • 符号被覆盖
  • 代码分散(意味着您在.as文件中获得了MC的代码,但也在.fla中,因此您始终需要检查.fla中的内容

如果省略所有时间轴代码,使用设计师/动画师也会容易得多。您所需要的只是一些需要严格遵守的准则:

  • 对于设计师:无论什么时候需要在某个帧上发生,创建一个带有语义名称的标签,开发人员可以使用这些标签来获取帧号
  • 对于开发者:永远不要只根据帧数添加帧脚本(除了第1帧的某种初始化,但即便如此)总是使用标签!

现在实际上有一种情况我会在时间轴上编写代码,严格来说就是停止带有一个端点而没有暂停的线性动画。就是这样。

- 编辑 -

很少发生你真的需要一个framecript,大多数时候你可以用不同的方式解决它,这总是比较好的。

答案 2 :(得分:2)

我写了一篇关于如何保持所有“时间线优点”的文章,但仍然使用Creynders和Mr.Ms所描述的良好的OOP实践。香肠http://www.developria.com/2010/04/combining-the-timeline-with-oo.html。我为亚特兰大Flash和Flex用户组做了一个演示,包括基于那篇文章的文件,你可以在这里查看http://www.meetup.com/atlflex/files/

答案 3 :(得分:1)

我经常对自己也有同样的疑惑。编程太长时间没有看到离开代码的绝对好处,但我肯定希望 - 在我看来 - 仍然保持时间轴和某些事件之间的联系。这是一个工具,所以显然只是放弃它是一个愚蠢的想法。

此外,您可以通过编程方式检索影片剪辑的当前帧和相应的标签。

http://adobe.ly/osU3A6 - 当前帧属性

http://adobe.ly/o1JVn5 - 框架标签列表

在ENTER_FRAME上编写一个侦听器,用于检查影片剪辑标签。您甚至可以编写一个很好的小服务,它可以提供一个集中的位置来注册具有某种特殊“标签语法”的侦听器。

这样的事情:

LabelDispatcher.addEventListener(movieClipTarget,frameLabel,callBackFunc);

我实际上并没有运行这个,我确信它会充满错误,但服务可能看起来像这样:

addEventListener(target:movieClip,frameLabel:String,callBack:Function):Boolean {

   this.internalListOfListens.push( { target:target, frameLabel:frameLabel, callBack:callBack } );

}

当您准备开始对帧标签进行操作时,请在舞台的EnterFrame上注册此Listener:

public function labelListenerPulse(event:Event):void {

for( listenedTo:Object in this.internalListOfListens ) {

       var target:MovieClip = listenedTo.target as MovieClip;

       if ( target.currentFrameLabel == listenedTo.frameLabel ) {

            var callBack:Function = listenedTo.callBack as Function;

            callBack( new Event( blah blah blah... ) );   

       }

 }

}