作者:Merrycat 日期:2007-01-18
最近公司FLASH学习小组把我选为组长了 。今天我给大家讲了一下“Flash中加载与执行顺序”,昨天总结了一下午,今天在BLOG上写个教程。如要转载,请注明出处。
先从简单的开始吧。
例1:帧内代码的执行顺序。
在FLASH第一帧插入一下代码:
程序代码
var a:String = "Mcat";
trace(a);//输出结果:Mcat
改变一下代码顺序把trace()函数提到上面来。
程序代码
trace(a);
var a:String = "Mcat";//输出结果:undefined
代码1和代码2相比较,代码2中a的输出的undefined(未定义)
说明代码是由上向下执行的。
什么?有点弱智?那么接着往下看吧。
例2:各帧之间代码执行顺序。
给FLASH的第一层取名为"layer1",在第1、2、3帧插入关键帧,分别写入AS,
layer1:trace("frame1")、trace("frame2")、trace("frame3")
如图:
测试一下,输出:
程序代码
frame1
frame2
frame3
frame1
frame2
frame3
frame1
frame2
frame3
……
说明层上帧上的代码是按照帧号从前往后执行的。
例3:不同层间帧代码执行顺序:
给FLASH的第一层取名为"layer1",第二层取名为"layer2",分别给它们的前三帧插入关键帧,分别写入AS,
layer1:trace("layer1_1")、trace("layer1_2")、trace("layer1_3")
layer2:trace("layer2_1")、trace("layer2_2")、trace("layer3_3")
如图:
测试一下,输出:
程序代码
layer2_1
layer1_1
layer2_2
layer1_2
layer2_3
layer1_3
……
在发布设置里更改一下加载顺序,FLASH中默认的是“由下而上”,这里我们来把它给成“由上而下”试试:
程序代码
layer2_1
layer1_1
layer2_2
layer1_2
layer2_3
layer1_3
……
仍然跟“由下而上”相同。
说明同一时间线,同一帧上,不同层中的代码,按照从上到下逐层执行,与加载顺序无关。从这个测试结果也可以看出,为什么我们制作FLASH时应该把用来放置AS代码的图层建在就上面。
例4:帧与影片剪辑之间的执行顺序。
给FLASH的第一层取名为"layer1",第二层取名为"mc",分别给layer1的前三帧和mc内的前三帧写入AS,
layer1:trace("layer1_1")、trace("layer1_2")、trace("layer1_3")
MC:trace("mc1_1")、trace("mc1_2")、trace("mc1_3")
如图:
测试一下,输出:
程序代码
layer1_1
mc1_1
mc1_2
layer1_2
mc1_3
layer1_3
mc1_1
layer1_1
mc1_2
layer1_2
……
可以发现第一帧时先执行的是帧上的代码,再执行的影片剪辑里的代码;而到第二帧之后则先执行影片剪辑里的代码再执行帧代码了。
现在将加载顺序改为“由上而下”,测试:
程序代码
layer1_1
mc1_1
mc1_2
layer1_2
mc1_3
layer1_3
mc1_1
layer1_1
mc1_2
layer1_2
……
和代码1的输出结果一样,由此,可以得出结论:在影片剪辑首次加载时执行第一帧时,先执行帧上的代码,再执行影片剪辑中的代码,在之后的帧循环里,反过来先执行影片剪辑中的代码再执行帧上的代码,与加载顺序无关。
例5:帧与同一层中不同深度的影片剪辑之间的执行顺序。
给FLASH的第一层取名为"layer1",第二层取名为"mc",在"mc"层中放入影片剪辑"mcTop"和mcBottom"。注意,这里可以通过修改-排列中的控制菜单来移动层中的影片剪辑深度来控制他们的上下关系。分别给layer1的前三帧,mcTop和mcBottom内的前三帧写入AS,
layer1:trace("layer1_1")、trace("layer1_2")、trace("layer1_3")
mcTop:trace("mcTop_1")、trace("mcTop_2")、trace("mcTop_3")
mcBottom:trace("mcBottom_1")、trace("mcBottom_2")、trace("mcBottom_3")
如图:
测试一下,输出:
程序代码
layer1_1
mcBottom_1
mcTop_1
mcTop_2
mcBottom_2
layer1_2
mcTop_3
mcBottom_3
layer1_3
mcTop_1
mcBottom_1
layer1_1
……
可以发现第一帧时先执行的依然是帧上的代码,再执行层中位置处于下方的影片剪辑里的代码然后执行上方影片剪辑里的代码;到第二帧还是先执行影片剪辑中的代码在执行帧中的代码,但是影片剪辑的代码输出的顺序和第一帧中又相反了。
这时我们再来更改一下加载顺序为“由上而下”,测试:
程序代码
layer1_1
mcTop_1
mcBottom_1
mcBottom_2
mcTop_2
layer1_2
mcBottom_3
mcTop_3
layer1_3
mcBottom_1
mcTop_1
layer1_1
……
这回看到了,在执行结果中,影片剪辑的执行顺序发生了改变。
为什么代码1中的影片剪辑的执行顺序跟我们预料的不一样呢?为什么更改了加载顺序的代码2中影片剪辑的执行顺序又发生改变了呢?
经过一番思考,我觉得可以用总结的一条结论来解释,那就是“栈”。什么是“栈”?可以打个比方,家里都有碗柜,在碗柜里放一落盘子,现在有三个盘子“A、B、C”。我们把它们按顺序放入碗柜。如图:
A是最先被放进去的,然后是B、C,然而如果要想把它们取出来的话,A则是最后一个,顺序是C、B、A了。我们可以把放盘子的过程看作一个加载的过程(第一帧执行的顺序),后面的帧循环看作把盘子拿出来的执行顺序。这样的话代码一是按“由下而上”的顺序加载的,第一帧中处于下方的mcBottom被先加载,然后是mcTop,而第二帧被看过一个“取盘子”的过程,执行顺序则变为“由上而下”了。
我们可以得出结论:既有帧代码又有同层不同深度的影片剪辑代码时,第一帧代码的执行顺序是按照影片剪辑的加载顺序执行的。而在后面的循环过程中是与加载过程相反的执行顺序。
例6:帧与不同层中影片剪辑之间的执行顺序。
给FLASH的第一层取名为"layer1",第二层取名为"mcBottom",第三层取名为"mcTop"。其实例6和例5的差别就是把例5中的两个影片剪辑分层放了,分别给layer1的前三帧,mcTop和mcBottom内的前三帧写入AS,
layer1:trace("layer1_1")、trace("layer1_2")、trace("layer1_3")
mcTop:trace("mcTop_1")、trace("mcTop_2")、trace("mcTop_3")
mcBottom:trace("mcBottom_1")、trace("mcBottom_2")、trace("mcBottom_3")
如图:
测试一下,输出:
程序代码
layer1_1
mcBottom_1
mcTop_1
mcTop_2
mcBottom_2
layer1_2
mcTop_3
mcBottom_3
layer1_3
mcTop_1
mcBottom_1
layer1_1
……
更改加载顺序为“由上而下”,测试:
程序代码
layer1_1
mcTop_1
mcBottom_1
mcBottom_2
mcTop_2
layer1_2
mcBottom_3
mcTop_3
layer1_3
mcBottom_1
mcTop_1
layer1_1
……
可以发现其结果是跟例5一样的。所以可以得出结论:既有帧代码又有不同层影片剪辑代码时,第一帧代码的执行顺序是按照影片剪辑的加载顺序执行的。而在后面的循环过程中是与加载过程相反的执行顺序。
呵呵,怎么样?头大了吗?其实还可以拿出更复杂的情况,不过变化无非就是上面的这几种,如果对以上几个例子都理解了,我想再怎么变化,你也能能找出它们的规则。