做了一下Flash脚本执行顺序状况的测试,总结出以下几条规则:
1.先执行帧脚本,再执行该帧中的影片剪辑中帧脚本.
2.同一帧中不同图层的帧脚本的执行顺序是从上层图层至下层图层;
3.不同影片剪辑中的帧脚本执行顺序是根据其加载顺序来的.通常下在同一帧中不同图层内的影片剪辑脚本以自下层图层至上层图层;
4.由于非脚本创建的影片剪辑最先加载,所以先执行非脚本创建的影片剪辑中的脚本,再执行由脚本创建的影片剪辑中的脚本,脚本创建的影片剪辑遵循"先创建/加载,先执行"的原则;
5.非脚本创建的影片剪辑的加载顺序是由深度低至深度高.
6.gotoAndPlay语句如果是跳转到同一影片剪辑中的某一帧,则该语句后面的语句还会执行,如果是跳转到其它影片剪辑(比如:_parent.gotoAndPlay(n)),则其后的语句不会执行.
上面的规则有点儿像绕口令,我们来看一个例子,这个例子我就不给源文件了:
1.新建一Flash文档,插入一个新图层,这样一共有两个层.
2.在两个图层中各插入一句:trace("这是图层一/二");
3.测试.
可以看到上面的图层先输出.交换图层位置可以验证.
我们继续:
1.新建一个MC,在MC里第一帧写上:trace("这是影片剪辑"+this._name);
2.在两个图层中各拖入一个MC.
3.执行.
继续:
1.把两个MC放到同一图层中.
2.改变MC的排列顺序,分别测试.
继续:
1.插入第二帧.
2.在第二帧中写:gotoAndStop(1);trace("这是第二帧");
3.测试.
继续:
1.修改MC,在MC中加入第二帧.
2.在第二帧中写:_parent.gotoAndStop(1);trace("这是影片剪辑中的第二帧");
3.将主场景中原先的两个MC删除.
4.在主场景第二帧的代码删除,新加上:stop();
5.将MC向第二帧中拖入一个.
6.执行.
由此可以验证上面的规则.
提醒一点:
由于执行顺序是由上图层至下图层,所以如果脚本中有#include,应放到上图层中.这样其中的函数或变量才能被下图层的脚本引用.
最后建议:
为了不被Flash的执行顺序搞晕,请按照OO的思想编写作品,gotoAndPlay使用适当,变量的引用也最好有封装性,不要在不同的影片剪辑中引用同一个变量,全局变量尽量不用.Flash并没有规则一定要怎样书写脚本才算合格,但是为了工作的方便,请注意规范写法.否则考虑脚本的执行顺序就够受的了.下面几个原则不妨遵守一下:
1.勤写注释.
2.脚本写在一帧中,不同段的脚本用注释分开.
3.脚本写在帧中,事件处理器不要加到按钮/影片剪辑上.
4.不使用全局变量.
5.不直接在函数中引用某一影片剪辑,而改用参数引用.
6.不要频繁使用gotoAndPlay.
7.常用的函数写到主场景的帧上,或者写到外部文件中再include.
8.影片剪辑里帧中如果有函数,不如为该影片剪辑自定义一个类再用AS2.0类链接.把该函数作为类的一个方法.影片剪辑中的变量亦是如此.
9.除非两段影片真的毫无关系,否则慎用多场景.