|
害死人的Sprite,发现新大陆,MovieClip.addFrameScript
(本文适用于Actionscript 3和FLASH 9 PUBLIC ALPHA) (如若转载,请留下作者frogcjn的Blog链接:frogcjn.blogba.cn) 没想到Sprite与MovieClip差别如此之大,以前只是以为Sprite只有一帧,MovieClip有无数帧. 有一次在fla文件的"Document class"填"A.as" A.as中的内容:
|
package{ import flash.display.*; public class A extends Sprite{//这里声明为继承Sprite,以前都是写成继承MovieClip public function A(){ var 文本 = "A"; //...A构造函数的内容就省略了 } } } |
然后在舞台的时间轴(第一帧)上写:
按"ctrl+enter"测试,竟然显示如下的错误提示:
ReferenceError: Error #1065: 变量 addFrameScript 未定义。 at A$iinit() |
我顶你个肺,哪里来的 addFrameScript 这个变量?FLASH 9 PUBLIC ALPHA总是输出莫名其妙的并且毫无用处的错误提示,真是顶你个肺! 于是我苦苦找BUG找了10分钟……最终怀疑到了"时间轴"和Sprite这两个可恶的家伙……将声明为继承Sprite改写为以前经常写的继承MovieClip ……真实太可恶了.
不过……我又知道了MovieClip的秘密:"addFrameScript"变量.将A.as写成继承MovieClip后,trace(addFrameScript);看看addFrameScript到底是什么: trace的结果:
查Flex 2的帮助,竟然没有说明"addFrameScript"这个方法,果然是个秘密! 将A.as改进为B.as,来详细研究:"addFrameScript"方法. B.as内容:
|
package{ import flash.display.*; public class B extends MovieClip{//这里改回以前经常写的MovieClip var i:int; public function B(){ i=0//在这里设置i的数值 if(i==0){ trace("构造函数运行"); return; } if(i==1){ trace("构造函数运行"); addFrameScript(1); return; } if(i==2){ trace("构造函数运行"); addFrameScript(1,2); return; } if(i==3){ trace("构造函数运行"); addFrameScript(1,2,3); return; } } } } |
在fla文件的"Document class"填"B.as",在舞台的时间轴(第一帧)上写:
然后"ctrl+enter"测试,结果的顺序是"构造函数运行""时间轴脚本运行",这是正常情况. 将B.as中在"//在这里设置i的数值"一行设置i的值为1,保存B.as,测试,输出结果:
构造函数运行 ArgumentError: Error #2001: 指定的参数太少;当前为 2,应该为 1。 at flash.display::MovieClip/addFrameScript() at B$iinit() 时间轴脚本运行 |
设置i的值为2,保存B.as,测试,输出结果:
设置i的值为3,保存B.as,测试,输出结果:
构造函数运行 ArgumentError: Error #2001: 指定的参数太少;当前为 4,应该为 3。 at flash.display::MovieClip/addFrameScript() at B$iinit() 时间轴脚本运行 |
看来addFrameScript有两个参数.(并且还可以看出Error 报告的愚笨,竟然把参数数量都给弄错了) 那么addFrameScript两个参数应该填什么呢?查google,只有一个俄文网站http://orangeflash.eu/?p=65对这方法的两个参数有介绍:
| addFrameScript(frame:uint,func:Function); |
注意frame指的是"时间轴帧数-1",也就是在第"frame+1"帧运行func.
进一步进行实验(实验过程我就不贴了)发现: 当addFrameScript在"Document class"使用时,测试,播放到第"frame+1"帧上时,把这一帧上原有的所有脚本都扔掉,不运行,而此时只运行func.之后继续正常地播放下一帧. 当addFrameScript在舞台时间轴上时,addFrameScript所在帧播放后,addFrameScript再生效.
例如在舞台时间轴的第5帧:
|
var A = function(); addFrameScript(4,A);//不管在第5帧的第几行,都在播放完第5帧时生效 trace("5"); | 如果这个舞台只有5帧,并且前4帧时间轴脚本分别为trace自己的帧号,(见范例文件中的C.fla),那么输出内容及输出时间为:
对于addFrameScript的介绍就到这里了, 不知道addFrameScript还有什么其他用处.
范例文件: AS3Addscript.zip © 2006 frogcjn 附言: 本作品采用知识共享署名许可协议(Creative Commons License)进行许可,未经同意,不得用于商业用途。
进入原文讨论:http://space.flash8.net/space/html/67/273067_itemid_304322.html
|