文章搜索:
打开支付宝首页搜索“510617664”,即可领红包
  首页--> 计算机--> 网页设计
 
动态复制MC时不要忘记initObject参数
http://www.xxqqss.com 学习轻松网 点击量:16380
 
在论坛上看到一个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  


打印】 【关闭
免责声明 :本站刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。对本文有任何异议,请发送fiyeadwyv@163.com
最热门点击排行
 
版权所有 2006-2021:学习轻松网 Copyright http://www.xxqqss.com All rights reserved 浙ICP备14013707号-1
广告联系电话: 13958357030 联系QQ:9792414 工具条下载