6.3 快进与快退
快进与快退技术似乎是影音播放机的行为,不错,你已经可以在这个程序当中了解到用Flash制作影碟播放机的作用了。在这个代码里你还可以了解到电影剪辑和场景之间的路径是如何使用的,让_currentframe和_totalframes返回场景的属性想必已经在上例接触过了,但如果是想在电影剪辑里控制场景的播放顺序就要看本例的制作了。另外本例中一个重要的学习就是关于控制类电影剪辑的使用。这也是Flash动画实现控制的一个重要概念,因为所有的控制一般都有一个过程,比方说我们想让播放的帧和一个数字进行比较,如果当前帧大于某个数字的话,哪么就执行某个功能。如果没有,就继续播放。这个功能就需要对两个数字进行不断的比较,而时间轴是有过程的,如果将进行比较代码加入到按钮的Action里,哪么不点击按钮,代码就不会被执行。如果是加入到帧上的话,当帧播放时执行一次,然后就不会再执行。我们需要的是不断的进行比较,这就可以用到控制类的电影剪辑了。因为电影剪辑中的时间轴是与场景与关的,只要在场景中加入足够的帧,电影剪辑就会一直播放下去,不断的进行变量比较,来达到我们的目的。 步骤一、选择主菜单中的Window|Common Library|Bottons命令,打开共享库面板。将快进和快退按钮拖入场景。 步骤二、再次选择主菜单的Insert|New Symbol命令,选择MovieClip插入一个电影剪辑。取名称为forward,进入电影剪辑的编辑区。 步骤三、双击第一帧打开Action面板,选择Basic Actions指令集中的stop指令,使电影剪辑在起始位置停止播放。 步骤四、在第二帧处按F6键加入一个关键帧。双击打开Action面板。 步骤五、选择Actions指令集中的set variable指令加入一个变量,在Variable框中输入变量名为i,在Value栏中输入代码_root._currentframe+2。勾选随后的Expression表达式单选框。如图6-16所示。

图6-16 变量输入框
步骤六、哪么变量i表示的是场景的当前帧加上2了。使用goto就可以实现跳转了吗?答案是否,因为我们现在是在电影剪辑里,所以如果直接使用goto指令,哪么也只能控制电影剪辑中的指针,想要在goto指令中加入一些对场景的控制,必须有路径的支持。 步骤七、哪么并非选择的是Goto指令,而是选择Actions指令集中的evaluate指令插入一个空行,然后输入代码_root.gotoandstop(i)。像C语言一样,Action脚本编程也支持很多种的语法结构,特别是在Flash5当中使用了.语法。但很多的语法在普通模式下输入有困难,在专家模式下输入又容易出错,怎么办?利用evaluate加入空行就是一个完美的解决方案。完成代码如图6-17所示。

图6-17 Action指令中的空行指令
步骤八、回到电影剪辑编辑区,在第三帧处按F6键使之成为关键帧,然后双击打开此帧的Action面板。 步骤九、双击Basic Actions指令集中的Goto指令,在参数输入栏中其它项选默认,只在Frame栏中输入2。此举的用意是在电影剪辑内部实现一个循环。当第一帧当载的时候,电影剪辑停止播放,但是一旦有命令让帧跳转到第二帧时,哪么电影剪辑的指针会在第二帧和第三帧之间来回播放。饶开第一帧的Stop指令。 步骤十、回到场景编辑区,选择主菜单的Window|Library命令,打开库面板,把电影剪辑拖到场景编辑区任意位置,因为这个电影剪辑其实是没有物体内容的,它在场景中只会以一个小圆点来表示,当影片发布了以后不会留下任何内容。拖入后的效果如图6-18所示,你可以看到有一个小圆点。

图6-18 代表空电影剪辑的小圆点
步骤十一、使用主菜单的Window|Panels|Instance命令打开Instance实例面板。点击这个小圆点,使它成为选取状态,然后在Instance面板中为它取分身名称为forward。如图6-19所示。

图6-19 为空电影剪辑取分身名称
步骤十二、在倒放按钮上点击鼠标右键选择Action,为按钮加入指令。 步骤十三、点击Actions指令集中的evaluate加入一个空代码行。然后输入代码_root.forward.gotoandplay(2)。此句的意思为让场景上的分身名称为forward的电影剪辑开始播放第二帧。系统会自动加上On(release)行。 步骤十四、按Ctrl+Enter键测试。当鼠标点击按钮时影片开始进速播放直到影片结束。 步骤十五、然后开始制作快退按钮的指令,依然是插入一个电影剪辑。起名为backward,然后进入编辑区,按F6键使第一、二、三帧都成为关键帧。第一帧指令stop(),第三帧为gotoandplay(2)与快进按钮的一样。关键的第二帧代码如下: i=_root._currentframe-2 _root.gotoandstop(i) 对照代码如图6-20。

图6-20 实现快倒控制的电影剪辑代码
步骤十六、回到场景,拖入这个电影剪辑,用Instance面板为它取分身名为backward。然后在按钮上加入像快进一样的代码吗?你有没有想过如果两个按钮都被按下两个控制影片播放的程序同时运行是会出错的呢?解决的方法就是当一个按钮按下时,另一个按钮的程序停止运行。 步骤十七、鼠标右键点击快退按钮选择Action项,打开Action面板。选择evaluate插入一个空行,输入代码_root.Backward.gotoandplay(2),再次点击evaluate项输入代码_root.forward.stop()。这样就实现了当点击快退按钮时快进按钮的程序段停止播放。完成如图6-21所示。

图6-21 快退按钮的完整代码
步骤十八、同样将快进按钮的指令改为: on(release){ _root.forward.gotoandplay(2)_root.backward.stop() } 步骤十九、按Ctrl+Enter键测试。如果你仔细看了这些程序你可以感觉到没有加入回放的代码行。一个完整的程序行是能经得起考验的,是不能存在bug的。哪么我们开始进入使之回放的程序设计。 步骤二十、在Library库面板中双击forward电影剪辑,进入forward电影剪辑的编辑区,双击第二帧。打开第二帧的Action面板。 步骤二十一、选取第一行,然后双击Actions指令集中的if指令,然后在参数输入框中输入代码i<_root._totalframes句。 步骤二十二、再双击Actions指令集中的set variable指令,输入变量名为i,Value栏中输入1,勾选后面的Expression单选框。完成如图6-22所示。

图6-22 快进电影剪辑的完整代码
步骤二十三、打开backward电影剪辑,进入电影剪辑的第二帧的Action面板。选择第一行代码,双击Action指令集中的if指令。输入代码I<1,然后选择set variable指令输入代码i=_root._totalframes。如图6-23所示。

图6-23 快退按钮的完整代码
步骤二十四、现在按Ctrl+Enter键测试应该没有什么问题了吧。 程序解读: 按钮的程序比较简单,当快进指令的电影剪辑播放时快退按钮停止播放。快退按钮开始播放时,快进按钮停止播放。难点主要还是在功能模块的电影剪辑里。以快进功能的电影剪辑为例。 第一句:赋值变量i为影片根目录的当前帧。 第二句:在当前帧的内容大于影片的总长度时。执行if段的指令。 第三句:重新赋值变量i的内容为1,也就是重新回到影片的起始位置。 第四句:影片的播放进度停止在变量i的内容。之所以使用gotoandstop()而不是gotoandplay(),是因为我们实际的控制只是让根目录的帧实现跳转。 知识要点: 此例中用影片跳跃似的播放过程,动态的改变了影片的播放进度。比方说用功能模块实现第一帧跳到第三帧再跳到第五帧。这样一种跳跃似的前进,从视觉方面形成了影片的快进。而实际上Flash动画的播放进度除了在Movie对话框中设置以外,根本不可能在影片播放过程中动态改变。另外在此例中引入了全新的对影片路径的认识,如在Insert面板中为电影剪辑取分身名称,这样影片才会为电影剪辑设置路径。而_root代表的是根目录的时间轴,而且只能代表根目录的时间轴,你可以使用相对路径表示其他的电影剪辑。但如果你想直接使用场景的话,用_root来表示是没有错的。另外所有的电影剪辑只要是拥有分身名称的,出现在时间轴上的电影剪辑,也都可以从_root场景目录中沿伸下来,当然,未在影片播放过程中出现的,没有取分身名称的,和其它场景中的电影剪辑不能准确的描绘其路径。在制作过程中你可能会有一点发现,就是变量i在整个动画过程中出现了两次,哪么变量的内容会不会引起冲突呢?答案是不会,在Flash动画中其实并没有绝对的全局变量,虽然全局变量的概念在Flash中也会存在,但是实际上Flash并没有真正意义上的全局变量。这与其它编程软件有所不同,Flash中的变量都是向下沿伸的,比方说,在根目录下有一个变量i,而在它所属的分身名称为MC的电影剪辑中也有一个变量i,哪么它们之间会有冲突。但如果场景中有两个电影剪辑分是是MC1和MC2,它们都在场景的根目录下,属于平级,哪么它们当中的变量i将不会起冲突。如果是这种情况,一部动画中共有两个场景,Scene1和Scene2,两个场景中分别有一个变量i的话,哪么也不会起冲突,场景是Flash动画中最大的实场面了,Scene1中的变量并不会在Scene2中存在的话,哪么说Flash动画中并没有真正意义上的全局变量。但是没有全局变量,Flash却拥有真正意义上的局部变量,可以说每一个变量都是局部变量,它们只在自己的活动范围内存在,它们只在自己的时间轴中起作用。它们会向自己的下一级路径沿伸自己的作用,但如果在下一级电影剪辑的功能模块里再次出现同名变量的话,可以使用var来定义局部变量,用var来定义的变量只在自己的代码模块中存在,离开自己的代码模块将不再起作用。这样一来也不会与上一级的同名变量起冲突。使用var来定义专属模块的功能变量是一个非常提倡的做法,它对大型程序开发有独特的帮助。
6.4 倒放
通过以上实例的制作会了解到不少实现帧跳转和影片控制的方法,其实影片控制的概念就是帧跳转。你也许已经会制作下例的倒放控制了。但是如果只是停留在一种技术上沾沾自喜哪么就无法突破自己的技术,真正技术高超的人都是在不断的探索着前进的道路,也许你已经明白了控制影片播放的技术,但也许你只是通过手动学会了以上的这个实例。在以下这个倒放按钮会与前几种技术不同,但也有共通之处,原因在于所有的技术,都是通过帧跳转来达到控制,但是每一种实现方法的技术手段又都是不同的,每一种方法都让我们领略了Action编程的多样性力量。 步骤一、选择主菜单中的Insert|New Symbol命令新建一个电影剪辑。取名为back,然后进入这个电影剪辑编辑区。 步骤二、在第一帧双击鼠标插入一个关键帧,双击此帧打开Action面板。双击Actions指令集当中的if项,使之出现在程序编辑区。在输入栏内输入_root.n。 步骤三、然后双击Actions指令集中的evaluare指令,加入一个空白程序行,在输入框内输入代码_root.prevframe(),实现跳转上一帧。完成如图6-24。

图6-24 完成跳转上一帧
步骤四、在第二帧按F6插入一个关键帧。双击打开Action面板,输入与第一帧完全相同的代码。 步骤五、回到场景,在场景编辑区从Common Library共享库面板中拖入一个倒放的按钮。鼠标右键点击按钮选择Action打开按钮的Action面板。 步骤六、在按钮的Action面板中双击Actions指令集中的set variable给变量赋值。变量名为n,值为true,勾选Value输入框后面的Expression单选框。完成如图6-25所示。

图6-25按钮的完整指令
步骤七、从Library库面板中把刚才制作的back电影剪辑拖入到场景中,在表示电影剪辑的小圆点上点击右键,打开电影剪辑的Action面板。 步骤八、双击Actions指令集中的set variable为变量赋值。变量名为n,变量值为false,勾选后面的Expression单选框。系统会自动加上OnClipEvent(load)指令,与按钮的Action面板的中指令极为相似。此句的意思为当帧装载时变量n的值为假。完成如图6-26所示。

图6-26 电影剪辑的载入指令
步骤九、按Ctrl+Enter键测试。是不是也达到了倒放的效果呢?不过依然还是存在老问题,即当动画播放到第一帧时会停止,并不出现回放。解决的办法是像步退按钮一样的做法吗?可以说是。但是请注意路径的使用。步骤十、打开back电影剪辑,在第一帧双击打开Action面板。使第一行成为选取状态,然后双击Actions指令集中的if指令,使其出现在代码编辑区。 步骤十一、在参数输入栏中输入代码_root._currentframe<=1。然后再双击evaluare加入一个空行。输入代码_root.gotoandstop(_root._totalframes)。完成后请对照图6-27。

图6-27 back电影剪辑的完整代码
步骤十二、在第二帧上双击打开Action面板。操作与第一帧完全相同。按Ctrl+Enter键测试。整个动画的控制程序就制作完成了。将所有的按钮进行整合,然后测试完整的效果。你可以从中学到很多的东西。 程序解读: 电影剪辑内的指令:表示当变量n等于真时开始根目录播放上一帧,由于电影剪辑内总是两帧不断的在循环。所以也会不断的发出场景的帧回到上一帧产生倒放的效果,哪么变量n是哪儿来的呢? 电影剪辑加载指令:我们在电影剪辑上点右键输入的代码意思为当电影剪辑加载时变量n为假,这就是变量n的初始值。 按钮内的指令:很简单,当点击按钮时,对变量n重新赋值为真。激活电影剪辑内的指令。 知识要点: 此例使用变量的逻辑值来激活电影剪辑的效果,在以前各类程序中并不多见,变量的逻辑值其实可以用有和空来理解。当真时,表示有这个变量。为假时表示没有。Flash中的变量是不需要指定属性的,系统会自动指定其为逻辑值还是字符串还是数值型,当然你可以使用Number等转换函数对变量内容进行转换。
出处:蓝色理想
责任编辑:蓝色
上一页 FLASH 5 教程 — Flash 影片控制 下一页
◎进入论坛Flash专栏版块参加讨论
|