论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash教程
Tag:flash cs,flash 8,鼠绘,as,手绘,工具,文字,loading,入门,初学,mc,影片剪辑,声音,mtv,游戏,引导,遮罩,菜单,补间,广告条,时钟,视频教程

害死人的Sprite,发现新大陆,MovieClip.addFrameScript

文章类别:Flash | 发表日期:2008-9-21 15:10:10

  

(本文适用于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构造函数的内容就省略了
          }
      }
}

然后在舞台的时间轴(第一帧)上写:

trace(文本);

按"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的结果:

function Function() {}

查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",在舞台的时间轴(第一帧)上写:

trace("时间轴脚本运行");


然后"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(){trace("A)};
addFrameScript(4,A);//不管在第5帧的第几行,都在播放完第5帧时生效
trace("5");


假如这个舞台只有5帧,并且前4帧时间轴脚本分别为trace自己的帧号,(见范例文件中的C.fla),那么输出内容及输出时间为:

1
2
3
4
5
1
2
3
4
A
1
2
3
4
A
1
//......

对于addFrameScript的介绍就到这里了,
不知道addFrameScript还有什么其他用处.

范例文件: AS3Addscript.zip
? 2006 frogcjn
附言: 本作品采用知识共享署名许可协议(Creative Commons License)进行许可,未经同意,不得用于商业用途。

进入原文讨论:http://space.flash8.net/space/html/67/273067_itemid_304322.html

上一篇:{技巧}如何将不同fps的flash合并到一起 人气:3113
下一篇:{技巧}从头学好AS3.0 人气:1892
视频教程列表
文章教程搜索
 
Flash推荐教程
Flash热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058