论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: 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,游戏,引导,遮罩,菜单,补间,广告条,时钟,视频教程

[分享]动态复制MC时不要忘记initObject参数

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

  在论坛上看到一个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时,假如好好利用这个参数,那么是可以让我们的复制更简洁,更方便。

如有疏漏之处,欢迎指出交流...(*^__^*)
视频教程列表
文章教程搜索
 
Flash推荐教程
Flash热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058