在这里一定要注意flash的程序播放的顺序问题
对于attach的mc来说,flash是先播放完成mc外场景的as然后再执行mc内部的as,对于这个例子来说也就是先执行了
gotoAndPlay
然后才执行了
stop
所以mc不会动
在flash中as的执行顺序问题是非常重要的,一般初学者也不是太注意这个问题,下面是5d即将出版的书flash疑难解答百例中关于这个问题的阐述:
(1)同在一个场景下面,同在帧上面的程序,哪个先执行?
我们在场景下面建立两个层,里面分别写上能输出不同语句的程序,我们的程序是:
trace("This is the Layer 1 of _root.");
与
trace("This is the Layer 2 of _root.");
写好了程序我们调整两个层的位置,然后分别运行,我们会发现,当Layer2在上面一层的时候运行结果如图9.36,先运行的Layer 2层里面的程序:
图9.36 Layer 2在上面时的运行结果
而当我们将Layer 2拖入下面后再执行,其运行结果变成图9.37,先运行的Layer 1上面的程序:
图9.37 Layer 1在上面时的运行结果
由此可见,当在同一场景下面,一帧里面的程序(层上),在上面层的程序总比下面层的程序先执行。
(2)层上与mc上的程序谁先执行?
在flash里面建立一个mc,然后拖出,在上面加入as语句:
onClipEvent (load) {
trace("This is on mc.");
}
然后我们隐藏掉刚才Layer 2里面的as,这样我们的运行结果是:
图9.38 层上与mc共有as的运行结果
如图9.38是先运行了层里面的程序然后运行了mc里面的程序(如果我们是EnterFrame也是一样的),也许你是以为mc在Layer 1层的下面才后执行的,我们把mc层拖到Layer 1的上面去再运行,发现结果还是如图9.38,所以我们可以下结论就是flash先执行帧上的程序然后执行mc上面的程序。
(3)场景下面和mc里面的程序谁先执行?
我们在上面一步的基础上面再在mc里面的帧上面加上程序:
trace("This is in mc.");
这样我们来判断一下mc里面的程序怎么样执行,如下图就是程序运行结果:
图9.39 mc内加入程序后的运行结果
由此我们可以判断出,flash是先执行帧上面的程序,然后再执行mc上面的程序,然后再执行mc里面的程序,对于一个mc来说也符合这个过程。
(4)同一场景下面,不同mc上面的as怎么执行?
我们再建立另一个mc,取名为mc2,在mc2里面加入程序:
trace("This is in mc2.");
然后拖出mc2单独放在一层里面,在mc2上加入程序:
onClipEvent (load) {
trace("This is on mc2.");
}
然后我们运行程序,这时候mc2所在的层在mc上面,如图9.40是程序运行结果:
图9.40 mc2在上层的运行结果
是不是有点晕,接着看,我们把mc2拖到mc1的下面,结果如图9.41:
图9.41 mc2在下层时候的运行结果
从两个运行结果可以看出,越在下层的mc越先加载,如果我们把load触发改成EnterFrame的话,运行结果又有变化,如图9.42是mc2在下面时候的运行结果:
图9.42 EnterFrame触发mc2在下面的运行结果
有这个程序的运行结果我们才真正看出不同mc上的程序的执行顺序,在mc加载的时候,下面的mc先加载完成,并且运行mc内部的程序,然后当加载完成后,mc上面的程序又按照上层先执行的规则来执行。下面还有个问题就是如果在mc里面还有mc上面又as,那在什么时候执行呢?我们在mc里面拖入一个mc2,然后加上输出程序,如图9.43的结果我们可以证明我们的结论就是加载的时候运行完成所有的mc内部的as。
图9.43 mc内部mc2上面的程序运行
(5)在同一层里面的mc的程序按什么顺序执行?
在上一步的基础上面,我们把mc与mc2放在同一个层里面,我们先拖入mc,然后拖入mc2(应该是mc2遮挡mc1),运行发现运行结果与图9.43相同,如果我们我们先拖入mc2后突入mc的结果与图9.42相同,由此可以看出,在同一层里面的mc也是下面的先加载,上面的mc上的程序先执行(利用Modify工具修改上下关系无效)。