|
动态复制MC时不要忘记initObject参数 |
http://www.xxqqss.com 学习轻松网 点击量:17037
|
|
|
在论坛上看到一个HTML里的FLASH图片切换效果,JS跟FLASH通信,本来觉得没啥特别的,不过仔细看了下发现里面有行代码比较“怪异”,在使用duplicateMovieClip复制MC时,它传递了三个参数:MC新名称、深度、Object类型的一个变量。顿时奇怪了,这个Object有什么作用了?查了下帮助手册,才发现,一直以来自己居然忽视了这么好一个东东,呵呵,太惭愧了。下面就来说说这个object到底能干些啥了!
这是文档里对duplicateMovieClip方法的说明: public duplicateMovieClip (name:String, depth:Number, [initObject:Object]) : MovieClip
参数 name:String - 已重制的影片剪辑的唯一标识符。
depth:Number - 一个唯一整数,指定要放置新影片剪辑的深度。使用深度 -16384 可将新影片剪辑实例放置在创作环境中创建的所有内容之下。介于 -16383 和 -1(含)之间的值是保留供创作环境使用的,不应与此方法一起使用。其余的有效深度值介于 0 和 1048575(含)之间。
initObject:Object [可选] - (Flash Player 6 和更高版本支持。)包含用于填充复制影片剪辑的属性的对象。此参数使动态创建的影片剪辑能够接收剪辑参数。如果 initObject 不是对象,则忽略它。initObject 的所有属性都已复制到新实例中。使用 initObject 指定的属性对于构造函数是可用的。 正是因为intiObject参数可选,我才忽视了这个参数的作用,我想肯定也有朋友跟我一样,这也是我写这篇文章的目的,呵呵 给某些朋友也提个醒。
从参数说明中可以看出,我们使用initObject参数可以在MC复制时初始化MC的属性,这里的属性可以理解为两方面:
第一、它是MovieClip类的属性,例如,_x _y _alpha等等我们经常使用的属性。
第二、不是MC固有的属性,而是一个自定义的变量,例如自定义一个link变量。
在没有使用initObject参数前,我完成MC复制以后还需要一个with来初始化MC的属性,例如: for( i=0;i<5;i++){ _mc.duplicateMovieClip("_mc"+i,i); var _mc = eval("_mc"+i); with (_mc){ _x=120*i; } }
我们还会遇到一个很常见的问题,例如,我要给每个复制出来的MC初始化一个link,当MC点击时,我要trace出这个link,需求很简单,我们可以尝试写如下代码: for (i=0; i<5; i++) { _mc.duplicateMovieClip("_mc"+i, i); var _mc = eval("_mc"+i); //_mc里设置一个_txt文本,用来记录i,假设link等于i _mc._txt.text = i; _mc._x = 120*i; //为每个MC赋予按钮事件,让它能够trace出指定的link _mc.onRelease = function() { trace(i); }; }
测试我们发现,复制出来的5个MC的文本显示的确实是0到4,不过当我们点击的时候我们会发现trace出来的都是5,奇怪了,为何我们看到的link是0到4,而我们trace出来的为何是5了?如果对程序内存分配稍微有些了解的话这个就很好理解了,在FLASH里,对于5个MC,我们trace的link变量是占用同一个内存地址。那么如何解决这个问题了?我之前的做法是在复制MC时就给MC一个变量,用来记录link。 for (i=0; i<5; i++) { _mc.duplicateMovieClip("_mc"+i, i); var _mc = eval("_mc"+i); _mc._txt.text = i; _mc._x = 120*i; _mc.link=i; _mc.onRelease = function() { trace(this.link); }; }
测试,达到我们预期的效果。 现在如果使用initObject参数,那么上面的问题就可以很容易解决了,同时精简了代码量。 for (i=0; i<5; i++) { var _obj={link:i,_x:120*i,num:i}; _mc.duplicateMovieClip(”_mc”+i, i,_obj); var _mc = eval(”_mc”+i); _mc._txt.text = _mc.num; _mc.onRelease = function() { trace(this.link); }; }
我们定义了一个名为_obj的Object类型变量,它传递了三个变量,link, _x ,num,其中_x是MC固有属性,那么MC复制出来以后_x坐标自动初始化,不需要我们去设置,对于link , num两个变量相当于我们给每个复制出来的MC都分配了独立的内存空间来存储这两个变量,任何时候我们都可以使用_mc.link来访问这个变量值,而不会出现之前我们遇到的共用内存地址所造成的麻烦了。 再查阅一下attachMovie方法,它也有一个initObject参数,方式使用和duplicateMovieClip的一样。因此在我们动态复制MC时,如果好好利用这个参数,那么是可以让我们的复制更简洁,更方便。
如有疏漏之处,欢迎指出交流...(*^__^*)
来源:闪吧 作者:llkings
|
|
|
|