做电子杂志经常需要做文字滚动和图片滚动,于是我编写了这个代码
可以方便快捷的使用,提高工作效率
我一直都在使用这个代码,比较实用,希望大家也喜欢

使用方法:

做两个按钮做滚动:up_btn,down_btn
做遮罩定下显示的范围:mask_mc
移动的mc:move_mc
把代码贴上去就OK!!

我整理了一下,与大家分享
会上传该fla文件,同时贴上脚本:

设置代码

/*
program    : hqlulu
mail    : hqlulu@163.com
website    : http://www.aslibra.com
publish    : 2006-10-31
*/
//判断是否移动
var move_it:Boolean = false;
//移动方向
var dir:Number = 1;
//移动速度
var speed:Number = 5;
//按下的移动速度加倍
var scale:Number = 3;
//滚轮的移动速度加倍
var scale_mouse:Number = 2;
//设置上下的边距
var margin:Number = 2;
//计算移动的范围
var max1:Number = mask_mc._y+margin;
var min1:Number = mask_mc._y-move_mc._height+mask_mc._height-margin;
//是否自动设置遮罩
var is_set_mask:Boolean = false;
//是否支持鼠标
var is_mouse_enable:Boolean = true;
//设置按钮、遮罩和移动的对象
var my_move_mc:MovieClip = move_mc;
var my_up_btn:Button = up_btn;
var my_down_btn:Button = down_btn;
var my_mask_mc:MovieClip = mask_mc;


脚本代码:

//自动调整遮罩的xy和宽
if (is_set_mask) {
   my_mask_mc._x = my_move_mc._x;
   my_mask_mc._y = my_move_mc._y;
   my_mask_mc._width = my_move_mc._width;
   my_move_mc.setMask(my_mask_mc);
}
//支持滚轮移动  
if (is_mouse_enable) {
   var mouseListener:Object = new Object();
   mouseListener.onMouseWheel = function(delta) {
       if (delta>0) {
           my_dir = 1;
       } else {
           my_dir = -1;
       }
       speed *= scale_mouse*scale;
       move_me();
       speed /= scale_mouse*scale;
   };
   Mouse.addListener(mouseListener);
}
//给向上的按钮赋予事件            
my_up_btn.onRollOver = function() {
   move_it = true;
   my_dir = 1;
};
my_up_btn.onRollOut = function() {
   move_it = false;
};
my_up_btn.onPress = function() {
   speed *= scale;
};
my_up_btn.onRelease = function() {
   speed /= scale;
};
my_up_btn.onReleaseOutside = function() {
   speed /= scale;
   move_it = false;
};
//给向下的按钮赋予事件            
my_down_btn.onRollOver = function() {
   move_it = true;
   my_dir = -1;
};
my_down_btn.onRollOut = function() {
   move_it = false;
};
my_down_btn.onPress = function() {
   speed *= scale;
};
my_down_btn.onRelease = function() {
   speed /= scale;
};
my_down_btn.onReleaseOutside = function() {
   speed /= scale;
   move_it = false;
};
//判断是否该移动            
my_move_mc.onEnterFrame = function() {
   if (move_it) {
       move_me();
   }
};
//移动mc            
function move_me() {
   if ((my_move_mc._y+my_dir*speed)>max1) {
       my_move_mc._y = max1;
   } else {
       if ((my_move_mc._y+my_dir*speed)<min1) {
           my_move_mc._y = min1;
       } else {
           my_move_mc._y += my_dir*speed;
       }
   }
}


下载源文件:up/1162346304.rar

★:图片载入中,请稍侯。如果长时间不能显示,请重复打开此栏目。
★1:

如图,新建rootup层,共四贞,依次在每贞上代码:trace("rootup1"); / trace("rootup2"); / trace("rootup3"); / trace("rootup4");运行结果如下:
rootup1
rootup2
rootup3
rootup4
……(同上循环)
●说明同一时间线贞上的代码是按照贞号从前往后执行的。

★2:

如图,新建rootdown层,跟rootup层一样,但在每贞的代码中把rootup换成rootdown。“加载顺序”为“由下而上”。运行结果如下:
rootup1
rootdown1
rootup2
rootdown2
rootup3
rootdown3
rootup4
rootdown4
……(同上循环)
再在“发布设置”里把“加载顺序”改为“由上而下”。运行结果跟上面的相同。
●说明同一时间线,同一贞号,不同层中的代码,按照从上到下逐层执行,与加载顺序无关。

★3:

如图,删除rootdown层,新建mcup层,并在第一贞上放一影片剪辑,此剪辑同样包含四个空白关键贞,依次写代码:trace("mcup1"); / trace("mcup2"); / trace("mcup3"); / trace("mcup4")。加载顺序为“由下而上”。运行结果如下:
rootup1
mcup1
mcup2
rootup2
mcup3
rootup3
mcup4
rootup4
以上是第一次执行的结果,在第二次及以后的循环中,只有前两行互换位置,其它都相同:
再把加载顺序改为“由上而下”,运行结果跟上面的相同。
●说明在剪辑第一次出现在贞中的时候,会先执行父时间线的代码,而在以后的循环中,都会先执行影片剪辑时间线代码,与加载顺序无关。

★4:

如图,这次在mcup层上放两个剪辑“mczuo”和深度值高于“mczuo”的“mcyou”,两个剪辑都包含四个空白关键贞,在mczuo上依次写代码:trace("mczuo1"); / trace("mczuo2"); / trace("mczuo3"); / trace("mzuo4"),而mcyou与之相似,只是把“zuo”换成“you”。加载顺序为“由下而上”。运行结果如下:
rootup1
mczuo1
mcyou1
mcyou2
mczuo2
rootup2
mcyou3
mczuo3
rootup3
mcyou4
mczuo4
rootup4
以上是第一次执行的结果,下面是第二次及以后循环的执行结果:
mcyou1
mczuo1
rootup1
mcyou2
mczuo2
rootup2
mcyou3
mczuo3
rootup3
mcyou4
mczuo4
rootup4
再把加载顺序改为“由上而下”,执行结果大致骨架不变,只是把每个单元(三句代码算一个单元)中mczuo1,mcyou1两句的先后顺序对换。
再通过修改→排列命令,对换“mczuo”和“mcyou”的相对深度,则运行结果又变回跟第一次运行结果相同。
●说明在剪辑第一次出现在贞中的时候,会先执行父时间线的代码,而剪辑时间线上的代码则按照剪辑加载的顺序执行。在第一贞中,mczuo的深度值小,加载顺序为“由下而上”,所以mczuo中的代码就先执行。在其后的贞中,代码的执行顺序与第一贞正好完全相反;而在以后的循环中,第一贞中的代码执行顺序也将保持跟后三贞一致。

★5:

如图:删除mcup层,建立mczuo和mcyou层。并把上例的影片剪辑“mczuo”和“mcyou”放在对应的层上。加载顺序为“由下而上”。运行后结果跟例4一样。
再改变加载顺序,情况跟例4一样。
再对换两个剪辑的层级,情况依旧跟例4一样。
●本例跟例4基本类似,这里剪辑所在的上层就相当与上例中的大深度值(视觉上靠上的深度),而下层则相当于小深度值(视觉上被掩盖的深度)。

★大总结:
如图:建立四个层和五个都包含四贞的影片剪辑。
●在“rong”层中的四个贞中依次写代码,分别输出“root1”/“root2”/“root3”/“root4”。
●在“mcshang”层中放置“up”,“middle”和“down”三个影片剪辑,它们的深度值依次减小,如图所示。在“up”中,“upfu”是父剪辑,它的四个关键贞依次输出“upfu1”/“upfu2”/“upfu3”/“upfu4”;“upzi”是子剪辑,它的四个关键贞依次输出“upzi1”/“upzi2”/“upzi3”/“upzi4”;“upsun”是孙剪辑,它的四个关键贞依次输出“upsun1”/“upsun2”/“upsun3”/“upsun4”。在“middle”中,无嵌套剪辑,它的四个关键贞依次输出“middle1”/“middle2”/“middle3”/“middle4”。“down”剪辑的结构与“up“相似,代码输出结果都是把对应的up换成down。
●在“mchzong”层中,放置剪辑“zhong“,它的四个关键贞依次输出“zhong1”/“zhong2”/“zhong3”/“zhong4”。
●在“mcxia”层中,放置剪辑“xia”,它的四个关键贞依次输出“xia1”/“xia2”/“xia3”/“xia4”。最后把加载顺序设置为“由下而上”,第一次运行结果及说明如下:
root1 //主时间线第一贞中,先执行主时间线代码
xia1 //再执行4层“mcxia”剪辑中第一贞代码
zhong1 //然后执行3层“zhong”剪辑中第一贞代码
//在第2层的三个剪辑中会先执行深度值由小到大,依次执行“down”,“middle”,“up”剪辑中的代码,而“down”和“up”剪辑中嵌套剪辑代码执行顺序则和主时间线包含影片剪辑的情况类似,可以参见例3。具体运行结果如下:

downfu1
downzi1
downsun1
middle1
upfu1
upzi1
upsun1
//主时间线第二贞及以后的贞中,代码的执行顺序会跟第一贞正好完全相反。具体运行结果如下:
upsun2
upzi2
upfu2
middle2
downsun2
downzi2
downfu2
zhong2
xia2
root2
upsun3
upzi3
upfu3
middle3
downsun3
downzi3
downfu3
zhong3
xia3
root3
upsun4
upzi4
upfu4
middle4
downsun4
downzi4
downfu4
zhong4
xia4
root4
而第2次及以后的循环中,运行结果除第一贞的执行顺序会变得跟后三贞保持一致外,后三贞均无变化。
●大总结:
1:时间线上代码的执行顺序按照包含这些代码的贞在时间线上出现的先后顺序排列。
2:同一时间线,不同层中,同贞号贞上的代码,按照由上到下执行,并且与加载顺序无关。
3:影片剪辑在时间线上刚出现的那一贞中,会先执行剪辑父时间线的代码,然后才执行剪辑时间线第一贞中的代码。而在其后的贞中,情况正好相反。
4:位于不同层级中的影片剪辑。在这些剪辑同时刚出现的那一贞中,会按照加载顺序分别执行其中的代码。而在其后的贞中,情况正好相反。
5:位于同一层中,不同深度的影片剪辑。情况和上面类似,只是这里的大深度值相当于上面的上层,而小深度值则相当于上面的下层。
6:当一个剪辑中有嵌套剪辑的时候,会把它做为一个独立的单元,解释程序将会一直等到把所有嵌套剪辑中同贞号贞中的代码执行完毕后,才会跳出此剪辑,然后进入别的剪辑、父时间线,或者是下一贞!
7:提示1:在3中,正像我们在“影片剪辑事件处理器的代码执行顺序”讨论过的,如果剪辑有load处理器,则在执行完父时间线代码后,会先执行load处理器,然后才是剪辑时间线代码。
提示2:不要把此例中的代码跟影片剪辑的名字混淆,其实当播放头进入某贞时,解释程序会首先解释此贞中所有的剪辑名字,以备此贞中的代码或此贞所包含的剪辑中的代码应用,这跟加载顺序无关。联系此例,也就是说,当播放头进入某贞时,解释程序会先解释此贞中所有剪辑的名字,然后执行此贞_root时间线上的代码,最后是按照加载顺序执行各剪辑中的代码。

牢记以上七点,无论影片的结构怎样复杂,我们都不会被其中的代码关系搞的晕头转向、迷惑不解了。比如,在本例中,如果把加载顺序改成“由上而下”,聪明的你,是否能够预测出运行后的结果呢?

FROM http://www.huoshan.org/houtai/blogv3/wenzhanghtm.asp?id_flash=27

在影片新建root层,并在其上建立四个空白关键贞,依次写代码:trace("_root1") / trace("_root2") / trace("_root3") / trace("_root4")。然后再新建mc层,在第一贞放一个影片剪辑,此剪辑在主时间线上存在三贞,自己的时间线上也有三个空白关键贞,并在其上依次写代码:trace("mc1") / trace("mc2") / trace("mc3"),然后再在此剪辑上再写如下代码:
onClipEvent (load) {
trace("load");
}
onClipEvent (enterFrame) {
trace("enterFrame");
}
onClipEvent (unload) {
trace("unload");
}
运行后的结果及说明如下:
_root1 //第一贞先执行主时间线代码
load //再执行load处理器
mc1 //最后执行剪辑时间线代码
enterFrame //第二贞先执行enterFrame处理器
mc2 //然后执行剪辑时间线代码
_root2 //最后执行主时间线代码
enterFrame //第三贞先执行enterFrame处理器
mc3 //然后执行剪辑时间线代码
_root3 //最后执行主时间线代码
unload //第四贞先执行unload处理器
_root4 //再执行主时间线代码
……(同上循环)
综上可以得出以下结论:
★:load处理器在剪辑的时间线代码执行之前执行,因此可以用它来初始化剪辑时间线中要用到的变量。
★:在影片剪辑第一次出现在主时间线某贞中时,该贞的代码会先执行,因此在此贞中调用影片剪辑中定义的变量或函数将会失败。(主时间线循环的情况例外,因为在主时间线第一次播放的时候,剪辑已经被解释,在主时间线第二次及其后的循环播放中,剪辑中的变量和函数都能被找到!)
★:enterFrame与load、unload处理器不会在同一贞中同时出现,load和unload事件在剪辑出现或被卸载的贞上代替enterFrame。
★:在每一贞中,剪辑enterFrame处理器中的代码都会在其父时间线代码执行之前执行,因此可以用enterFrame处理器改变父时间线的属性,然后立刻在父时间线的代码中得到应用,所有这些都在一贞中完成!
★:一旦剪辑被卸载,其时间线代码就不会再被执行。
→参考《ActionScript权威指南》第256页
★FLASH中的堆栈结构其实可以分成三大类:.swf文档中的_level堆栈→_level中的层堆栈和程序化堆栈。这三大类相互影响,相互关联。
●.swf文档堆栈:它是一个独立的单元,位于_level(n+1)上的内容在视觉上会永远遮挡位于_leveln上的内容,也就是说,_level(n+1)在.swf文档堆栈中的位置高于_leveln。.swf文档堆栈又包含了在它们中手动创建的层堆栈和程序化生成的堆栈。

●手动创建的层堆栈:它包括两类,一类是时间轴图层面板上中的层堆栈,它们在视觉上是显而易见的。上层的内容在视觉上遮挡下层的内容。但是有一点必须说明,就算两个剪辑位于不同的层,依然可以用swapDepths()方法对它们的深度进行交换,并在视觉上反映出来。另一类是在图层面板中,同一图层中不同深度的堆栈,它们在视觉上更直观,视觉上靠上的,说明它的深度值就大。我们可以通过“修改”→“排列”手动的调节它们的深度。最后需要说明的是:其实两类同属于.swf文档的内部层堆栈,可以通过swapDepths()方法交换它们的深度。

●程序化堆栈主要也分两类,一类是用duplicateMovieClip()生成的堆栈,另一类是用attachMovie()生成的堆栈。其实每一个剪辑都又包含自己的一个小栈。用duplicateMovieClip()方法复制出的子剪辑被放到和父剪辑同级的堆栈中,而用attachMovie()复制的子剪辑,则会被放到父剪辑的堆栈中,变成从属关系。请看下面的例子:
我们在_root主时间线上建立两层和两个剪辑shang和xia,shang位于上层,xia在下层,并在库中建立一个连接标识符为“ku”的剪辑。然后在主时间线上运行下面的代码:
shang.duplicateMovieClip("dshang",1);
xia.duplicateMovieClip("dxia",2);
shang.attachMovie("ku","ashang",100);
xia.attachMovie("ku","axia",2);
运行后,所有的影片剪辑在视觉上按从上到下的排列结果是:
"dxia"
//dxia的深度为2,最高
"dshang"
//dshang深度为1,其次
"ashang"
//ashang的深度值尽管为100,但他隶属于shang,而shang又低于同级的dxia和dshang,所以,ashang只能排第三
"shang"
//shang和ashang同级,但它的深度值小于ashang
"axia"
//axia和xia同级,但在xia上
"xia"
//xia在axia的下面(具体原因我将在“影片剪辑深度大揭谜”中详细说明
→参考《ActionScript权威指南》第333页
→2005.12.2

★下面这个是总结《ActionScript 2.0与RIA应用程序开发》中的几段,由于跟上面的讲解联系比较紧密,也顺便发上来吧。
★细心的朋友也许会发现,在我们用duplicateMovieClip()来复制影片剪辑的时候,好象复制出来的剪辑总会在原剪辑的上面。果真如此吗?呵呵:)其实我们都被FLASH蒙了!——暂时把这个问题放下,我们先来揭开FLASH深度的神秘面纱。其实,在FLASH中,深度共划分为三个区域:
●时间轴区(-16384→-1),这里主要用于放置在FLASH中,手动创建的图象、影片剪辑、按钮等,此区域中的剪辑不可以用AS删除,但可以用AS动态的创建剪辑到这里。其实-16384就是_root的深度值,我们可以用trace(_root.getDapth())获得。
●动态区(0→1048575),这里允许AS动态的创建和删除影片剪辑。
●保留区(1048576→2130690045),这里允许用AS动态的创建剪辑,但创建后无法删除。
●超出以上三区后,就无法再用duplicateMovieClip()和attachMovie()动态创建剪辑了,但仍可以用createEmptyMovieClip()动态创建,只是创建后,也无法删除。
●除了动态区,其它区的剪辑都无法删除,但我们可以先用swapDepths()把要删除的剪辑交换到动态区,然后再删除。
   现在我们明白为什么我一开始说我们被蒙了吧?因为我们在用duplicateMovieClip()创建剪辑的时候,习惯上都喜欢把深度值设置为正数,而原剪辑由于是手动创建的,位于深度值为负值的时间轴区,所以肯定会比复制出的剪辑靠下。如果我们复制时把深度值设置的足够小(最小不能小于-16384),它就有可能位于原剪辑的下面。
→参考《ActionScript 2.0与RIA应用程序开发》第41页
by jimohuoshan

★序言:《ActionScript权威指南》由Colin Moock原著,赵声攀等翻译。虽然是一本讲解FLASH 5的编程书籍,但它却是我目前所看到过的,国内最好的一本AS入门书籍。感谢本书带我真正步入AS的殿堂!我把这本书看了四五遍,对其进行了支解、扩展和重构,我现在的AS知识体系基本上都是来自这本书,现在我把这其中的精髓提炼成十篇左右的文章,以后每天来贴一篇。
★她虽然是讲AS1.0的,但更多涉及的是AS底层的原理性的东西。这些东西永远不会过时,除非AS真的由解释型语言转变成编译型了,或者语法重写了。另外,如果不特别说明,所有的测试平台都是MX 2004,AS 2.0,也就是说虽然是AS1.0的东西,但我的测试环境是2.0的,它们在2.0中也适用。
★这些都是一些很基础的东西,再加上我总结它们的时候,自己也是入门级,所以他们特别适合AS菜鸟,当然如果你并非Colin Moock那样的AS绝顶高手,最好也看一下,最起码起到查漏补缺的作用。假如你发现有些东西竟然是第一次知道,那我只能很遗憾的告诉你,你还未真正步入AS的殿堂,放下一味追新那浮躁的心,好好看看这些东西吧!
★最后想说的是,由于我自己的水平也是很业余的,所以肯定有很多总结的不对的地方,把它们贴出来,也是希望能有高人帮我纠正一下,火山荣幸&&感激!

★1:typeof操作符可以测得变量的数据类型。例:trace(typeof x); //输出undefined
注:typeof得到的是一个串,例:if (typeof x=="undefined"){……};Undefined必须加上引号!→页码:P27
★2:在AS1.0中,无真正的全局变量,但可以用下面的方法模拟:Object.prototype.myGlobalVariable=myVariable; →P63
★3:{x:10,y:20} //花括号以及被逗号分隔开的属性名/值对表示是一个对象。→P77
★4:任何数字与NaN进行四则运算的结果都为NaN。→P79
★5:屏幕文本域输入的内容一定为串,如果想对其执行数学运算,必须用Number()函数进行转化。→P83
★6:数据类型的自动转换中,转换的只是原数据的拷贝,只是一个临时的转换!→P84
★7:当调用toString()方法把数字转化为串的时候,应该这样写:(100).toString(); //用括号防止“.”被当作小数点。→P82
★8:FLASH使用双精度浮点数,支持大约15位精度的有效数字。注意:精度不等于大小。“大约”又是什么意思呢?→P92
★9:NaN是一种合法的数据类型。但如果两个变量的值都是NaN,他们并不相等。→P94
★10:在AS中,串也可以用单引号表示,单双引号可以交叉使用,但必须首尾层次对应。→P96
★11:含有一个空格的串与空串并不相等:即:"" != " " 。→P101
★12:相对于substr()和slice()函数,subString()函数是最佳的选择,效率最高。→P113
★13:当我们最初定义一个变量的时候,它的值会默认为undefined。→P122
★14:引用一个不存在的变量,会返回undefined。→P123
★15:从理论上说,null类型和undefined类型是一样的。但null值不是由解释程序自动赋值的,而需要我们人为赋值。用以表示不含任何数据类型数据的合法空数据容器。注意:null只等于自身和undefined。→P123
★补充1:一个影片剪辑被卸载掉后,它所包括的变量也就无法再被访问。(卸载的方式包括:unLoadMovie(),载入其它影片,空白关键贞。)
★补充2:时间线上的变量必须先声明,才能在其后的贞中访问,但一旦声明后,就能在所有的贞中访问了。
例如:在主时间线上建立三个空白关键贞,并依次在每贞中写代码:trace(a); var a="huoshan"; trace(a);运行的结果将会是:
undefined
huoshan
huoshan
huoshan
……(同上)
★16:AS模除法中,5%4.5=0.5; 余数可以为小数。→P134
★17:operand1 || operand2 从理论上讲,处理逻辑or的第一个步骤是将operand1转换为布尔,如果转换的结果是true,那么逻辑or就返回operand1的值;否则逻辑or就转向operand2进行求值。如果operand1已经可以转换为true,就不再理会operand2。→P146
★18:逻辑and和or的运算机理相似。→P148
★19:delete操作符可删除一个对象,一个对象属性,一个数组元素,或变量。→P153
★20:数组元素操作符可用作对象属性操作符。例:ball["radius"]=150;其实,从功能上说,点操作符和[]操作符在功能上是一样的,可以用来设置和获取对象的属性值。 →P153
★21:条件操作符的语法格式:condition ? result_if_true : result_if_false; 例:
Var guess"c";
Var answer="d";
Var response = (guess==answer) ? "right" : "wrong";
如果guess等于answer,则response的值为"right",如果不是,则response的值为"wrong"; →P154
★22:function function_name(argument_list) {};上面的语句中,function 是函数声明语句,function_name是一个标识符(函数标识符),()是函数调用操作符。→P154
★23:function语句总是必须包含一个语句块,即使被声明的函数中只包含一个语句。→P159
★24:没有return语句的函数将返回undefined。→P164
★25:条件语句的测试表达式不一定要求出布尔值,任何表达式都可以,他们将按照AS数据类型的自动转换规则来进行转换。→P171
★26:条件语句,当只有一个语句的时候,可省去{},如下:if (x==y) trace("y");→P177
★27:条件表达式不一定要求出布尔值,任何表达式都可以,但是此表达式的结果将按照FLASH数据类型的自动转换规则转换为布尔值。→P189
★28:在FLASH PLAYER 5 中,循环被限制在15秒内。→P189
★29:当执行任一贞的脚本时,影片场景在视觉上要等到脚本结束才能够更新。→P191
★30:enterFrame事件处理器一旦开始就无法停止,惟一的办法就是删除此影片剪辑。→P193
★31:可以用空白关键贞以及attachMovie()和removeMovieClip()有效控制影片剪辑enterFrame循环事件的开始和结束。→P194
★32:函数变元(即传递给函数的实际参数)在传递给函数前就被先求值。→P203
★33:在同一贞的代码中,函数可以在被声名前调用。→P208
★34:函数会先在局部作用域中查找变量,如果没有找到,就会在其所在的时间线或所属对象与类中查找,如果还没有找到,则返回undefined。→P209
★35:当局域变量在函数的结尾死亡时,和他们对应的存储器空间就会被释放。因此使用局域变量存储所有的临时值,就能在程序中避免存储器的浪费。→P212
★36:形式参数和实际参数的数目可以不等。→P213
★37:传递给函数的参数可以用arguments对象访问。→P213
★38:对于原始数据类型的参数,函数接受到的是数据的拷贝,而复合数据类型的参数,函数接受到的则是一个指针,指向原数据。→P215
★39:从理论上说,函数应该是一种特殊的对象。→P220
★40:当播放头进到某贞后,先执行代码,然后更新屏幕,并播放声音。→P227
★41:当我们为剪辑添加事件处理器的时候,处理器中定义的变量,其作用域将在此剪辑的时间线上,内部的this将指向当前的剪辑。→P234
★42:按扭处理器的作用域是按扭所在的时间线(注意:不是按扭本身),其内部的this将指向它所在的时间线上。→P237
★43:一个MC的内容被unLoadMovie()函数卸载后,马上就会有一个空的占位符MC被载入到该MC中。所以,一个unLoadMovie()事件必将导致一个loadMovie()事件的发生;反之亦然。→P245
★44:影片剪辑的用户输入事件会被所有的MC以及_root所接受,并做出响应的反应。→P250
★45:影片剪辑事件处理器具有记忆特性,事件的每次发生都会记录在贞中间,并在每一贞得到渲染时,在屏幕中显示出来。如果想让渲染在事件的每次发生时都即时进行,以让渲染能平滑进行,可以使用updateAfterEvent()函数,但按扭事件不能用此函数。→P259
★46:数组可以有空元素,这样的数组成为稀疏数组。→P266
★47:delete操作符可以删除一个命名数组元素,并释放内存。语法:delete arrayName.elementName;→P274
★48:FLASH 5只支持一维数组。→P289
★49:方法其实就是实现对象行为的函数。→P293
★50:在单纯的OOP中,一般不直接访问对象的属性,而是调用方法来访问属性的值。→P297
★51:在每一个对象里重复地复制相同的函数时,会造成存储器的浪费。→P302
★52:传统上,类构造器的首字母大写。→P303
★53:在FLASH 5中,类的方法可以在类构造器外定义。→P306
★54:函数同时也是对象,可以带属性。创建构造器函数的时候,解释程序会自动赋值一个称为原型(prototype)的属性。→P308
★55:_ _proto_ _属性主要用来查找对象继承属性,也即对象的prototype属性。此属性是在任何对象被创建的时候,解释程序自动赋给它的属性。→P311
★56:内置对象在FLASH播放器启动的时候,会自动由解释程序创建,并在影片播放的过程中保持有效。→P319
★57:影片剪辑中的一个变量就是它的一个属性。→P321
★58:一般把FLASH文档里的主影片叫作主影片时间线或_root。一个.swf文件可以从播放器中删除,但一个主影片却不能从.swf文件中删除。duplicateMovieClip(),removeMovieClip(),swapDepths()方法用在主影片上是无效的。另外,FLASH播放器可以包含多个.swf文件,但每一个.swf文件只能包含一个主影片。→P324
★59:在希望保留剪辑的事件处理器和复制过程中的转换的时候,要使用duplicateMovieClip(),而不是attachMovie()。如果一定要使用attachMovie()的话,可以将事件处理器中的代码改用函数直接量的方式写在此剪辑中。→P325
★60:每一个剪辑实例的名称都可以用剪辑内置属性_name来访问和设置。→P330
★61:如果手动创建的MC没有命名,它将在运行的时候,由播放器自动赋给一个类似instance1,instance2……instancen之类的名称,但n到底是几,我们无法控制。→P331
★62:loadMovie()函数会在语句块儿中最后执行,所以,不能在同一个语句块儿中,访问被加载的外部影片的属性和方法。→P332
★63:不能从一个文档的库中添加剪辑到其它文档。所以,当一个剪辑中加载了一个外部.swf文件后,就不能对此剪辑使用duplicateMovieClip()和attachMovie()方法了。→P333
★64:剪辑深度值有间隙不会造成存储器的浪费。→P337
★65:装载新的.swf到_level2上,会在视觉上覆盖_level1上的影片,但不会把它从播放器中删除。→P337
★66:unloadMovie()将删除剪辑的内容和自定义属性与函数,但不删除内置属性与方法还有剪辑本身。要完全删除,可以使用removeMovieClip()函数。→P354
★67:在unloadMovie()函数中,如果使用了一个不存在的剪辑或层级作为它的参数,那么调用此函数的剪辑本身将被卸载。→P354
★68:全局函数和剪辑方法在表面上看一样,但它们在本质上完全不同,比如unloadMovie()等。→P359
★69:原始数据按值传递,复合数据按地址传递。→P379
★70:
x=[1,2,3];
y=[1,2,3];
trace(x==y); //得到false
x=y;
trace(x==y); //得到true
复合数据比较的是引用,而不是值。→P381
★71:原始变量作为参数传递给函数时,函数内对数据的任何操作都不会影响原来的变量,而复合变量则会受到影响。→P382
★72:影片剪辑和对象在播放器中的实现是不同的,相互分开的,主要原因是它们被分配和解除分配的方式不同!→P397
★73:被旋转或遮盖的文本域内容不会显示在屏幕上,除非它的字体是嵌入的。→P437
★74:scroll属性表示当前显示在文本域中最顶端的行数。→P438
★75:未定义的文本域出现在屏幕上,但包含的值为undefined不会被for-in语句列举出来。→P450

★分母为0时:
→若分子为0或非数字串,则结果为NaN:
trace(0/0);    //NaN
trace("a"/0);    //NaN
→若分子为正数,则结果为Infinity:
trace(1/0);    //Infinity
→若分子为负数,则结果为-Infinity:
trace(-1/0);    //-Infinity
★分子为Infinity时:
→若分母为Infinity,-Infinity,则结果为NaN:
trace(Infinity/Infinity);    //NaN
trace(Infinity/-Infinity);    //NaN
→若分母为0、有限正数或非数字串,则结果为Infinity:
trace(Infinity/0);    //Infinity
trace(Infinity/1);    //Infinity
trace(Infinity/10000);    //Infinity
trace(Infinity/"a");     //Infinity
→若分母为负有限数,则结果为-Infinity:
trace(Infinity/-100);    //-Infinity
★分子为-Infinity时:结果跟Infinity相反。
★分母为Infinity时:
→若分子为数字,则结果为0:
trace(0/Infinity);    //0
trace(1/Infinity);    //0
trace(-23/Infinity);    //0
→若分子为非数字串,则结果为NaN:
trace("sdf"/Infinity);   //NaN
★注意:如果分子分母中有数字串,则此串会被转换成相应的数字再进行运算:
trace("1"/0);  //NaN
trace(Infinity/"8");    //Infinity
trace(Infinity/"-8");    //-Infinity
trace("-23"/Infinity);    //"23"会先转换成23,结果还是0
→参考《ActionScript权威指南》第132页

分页: 3/7 第一页 上页 1 2 3 4 5 6 7 下页 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐