闪无忧
 
首 页 业界新闻 业界杂谈 Flash教程 Flash源码 Flash图书 Flash酷站 Flex & AIR 供求信息
   本栏目通告:   无论老手还是新手,只要有自己的想法和建议,请大家积极投稿本栏目
当前位置 :首页>业界杂谈>经验技巧>列表

flash中动态复制MC时不要忘记initObject参数

[来源:SimpleLife blog | 作者:小力 | 时间:2008-05-03 | 点击:  | 收藏本文  【 】]
在论坛上看到一个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,需求很简单,我们可以尝试写如下代码:
  测试我们发现,复制出来的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文本,用来记录i,假设link等于i
_mc._txt.text = i;
_mc._x = 120*i;
//为每个MC赋予按钮事件,让它能够trace出指定的link
_mc.onRelease = function() {
trace(i);
};
}

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参数,那么上面的问题就可以很容易解决了,同时精简了代码量。
  我们定义了一个名为_obj的Object类型变量,它传递了三个变量,link, _x ,num,其中_x是MC固有属性,那么MC复制出来以后_x坐标自动初始化,不需要我们去设置,对于link , num两个变量相当于我们给每个复制出来的MC都分配了独立的内存空间来存储这两个变量,任何时候我们都可以使用_mc.link来访问这个变量值,而不会出现之前我们遇到的共用内存地址所造成的麻烦了。

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);
};
}

  再查阅一下attachMovie方法,它也有一个initObject参数,方式使用和duplicateMovieClip的一样。因此在我们动态复制MC时,如果好好利用这个参数,那么是可以让我们的复制更简洁,更方便。

文章如果有错误或者缺少文件,请发邮件提交给我们
上一篇:Flash中注册点与中心点的区别
下一篇:flash学习的方法与态度,送给新手
Tags:    " 参数 _mc" 复制 ink MC trace 我们
>>> 最新评论:(共有 0 位网友发表了评论)      查看所有评论
  发表评论
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
·本站发布内容均为客观表达作者观点,不代表闪无忧立场,请勿攻击和漫骂
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
  业界杂谈
  业界前沿   资源分享
  经验技巧   七嘴八舌
  热门文章
·flv制作工具大全
·2006年Flex大型优秀网站欣赏
·Adobe Flex编码指南v1.2(AS3 Flex3程
·如何把fla,swf文件转换为flv格式问答
·电脑flash绘画心得
·flash使用习惯上的一些建议分享
·一个老Flash程序员对国内flash界的看
·什么是真正的Flash高手
·不要着急买Flex 3的书
·为什么说计算机动画不能完全代替传统
关于我们 - 免责声明 - 网站地图 - 商务服务 - 联系我们 - RSS地图
©CopyRight 2006-2008, 5UFlash.COM, Inc. All Rights Reserved
鲁ICP备06034971号