和我们一起放飞理想吧!
  • 本栏最新文章
摄影专辑AD
  • 本栏推荐文章
当前位置:应用教程首页 >> FLASH教程 >> 详细内容

一步一步学ActionScript 2.0(二十五)

2007-12-29 22:09:24    作者:时进军    来源:68design.net    文字大小: |  | 
简介:MC的复制   [学习目标]:掌握实现MC的复制的不同方法,能利用这些方法实现一些特效。 在上讲给大家说了外部swf、jpeg文件的装载的装载方法,大家会用loadmovie等函数或者方法就可以了,比较难点的就是在载入时 ...


MC的复制  
 [学习目标]:掌握实现MC的复制的不同方法,能利用这些方法实现一些特效。
 在上讲给大家说了外部swf、jpeg文件的装载的装载方法,大家会用loadmovie等函数或者方法就可以了,比较难点的就是在载入时的loading的实现,等后面我们介绍MovieClipLoader类这个问题就简单了。本来想接着说这个类的,可是毕竟MC类的方法还有几个用的多的没有说,所以就把MovieClipLoader类放在后面吧,等讲到大家再回头看,就知道了。
  这次我给大家讲下MC的复制,这个问题应用很广泛的,比如我们在网上看到的下雨、下雪效果,还有很多随机的漂亮变幻的线条效果,基本上都是通过MC的复制实现的。
  接触的到的函数和方法基本上就是attachMovie() ,duplicateMovieClip(),removeMovieClip() ,setProperty(),getProperty()。下面我们详细介绍下。
 
一、MC复制用的方法和函数
1、MC的方法
方法  说明
MovieClip.attachMovie()  附加库中的 SWF 文件。
MovieClip.duplicateMovieClip()  重制指定的影片剪辑。
MovieClip.removeMovieClip()  如果影片剪辑是用 duplicateMovieClip()、createEmptyMovieClip()、MovieClip.duplicateMovieClip() 或 MovieClip.attachMovie() 创建的,则将其从时间轴中删除。
⑴MovieClip.attachMovie()
格式:myMovieClip.attachMovie(idName, newName, depth [, initObject])
参数:
  idName 在"链接属性"对话框中的"标识符"字段中输入的名称。
  newname 附加到该影片剪辑的影片剪辑实例的唯一名称。
  depth 一个整数,指定 SWF 文件所放位置的深度级别。
  initObject (Flash Player 6 和更高版本支持)包含要用来填充新附加的影片剪辑的属性的对象。
这个参数有些难理解,我个人认为是这样的,这个参数就是个对象,把这个对象的属性加在了新复制的MC上,使新复制的MC上具有了这个对象的属性定义的一切属性。目的就是在复制的同时改变其属性罢了。举个例子
var initObject = new Object();//创建了个新对象initObject
initObject._alpha= 50;
initObject._x=100;
initObject._y=100;
_root.attachMovie("attach_mc", "attach1_mc", 2, initObject);//attach_mc是链接id
上面的代码我们可以简单的写成:
_root.attachMovie("attach_mc", "attach1_mc", 2, {_alpha:50,_x:100,_y:100});
更简单吧:)
 上面用到了一个运算符{}(对象初始值设定项)。
格式:object = {name1:value1, name2:value2,...nameN:valueN}
参数:
object 要创建的对象。
name1,2,...N 属性名。
value1,2,...N 每个 name 属性对应的值。
⑵MovieClip.duplicateMovieClip()
格式:
myMovieClip.duplicateMovieClip(newname, depth [,initObject])
参数:同上,就是不需要链接id了
⑶二个方法的说明:
①上面的2个方法的参数:idName、newname都是字符串,所以都要用""括起来呀。否则调用不成功的。
②第三个参数可以省略的,因为属性的改变我们可以通过复制完成后调用setProperty()函数进行。
③深度如果不理解可以回头看前面的教程有详细介绍。
④as代码不要放在要复制的MC上,自己不能复制自己的。
2、全局函数
方法  说明
duplicateMovieClip()  重制指定的影片剪辑。
格式:duplicateMovieClip(target, newname, depth)
参数:
  target 要重制的影片剪辑的目标路径。
  newname 已重制的影片剪辑的唯一标识符。
  depth 已重制的影片剪辑的唯一深度级别。
如:我们要复制d_mc,得到的新实例为d1_mc,放在my_mc内,可以写成下面的代码:
duplicateMovieClip("d_mc","d1_mc",200)
二、复制后的MC的卸载
MovieClip.removeMovieClip() 或者removeMovieClip()都可以的。
三、复制后的MC的属性控制
 1、在复制时改变属性
 MovieClip.duplicateMovieClip()、MovieClip.attachMovie() 的参数 initObject可以完成。
 2、全局函数setProperty()
方法  说明
setProperty() 当影片播放时,更改影片剪辑的属性值。
getProperty(my_mc, property) 返回影片剪辑 my_mc 的指定属性的值。
格式:
  setProperty(target, property, value/expression)
参数:
  target 到要设置其属性的影片剪辑实例名称的路径。
  property 要设置的属性。
  value 属性的新文本值。
  expression 计算结果为属性新值的公式
比如MC名字:my_mc:
setProperty(_root.my_mc, _alpha, "30");
my_mc_x = getProperty(_root.my_mc, _x);
四、应用实例
要求:做个飘雪效果
步骤:
1、新建flash文档
2、新建MC元件mask,在新建图层中画个大大的(1000*1000大小),中间是空(大小是场景的大小)的正方形。然后给这个MC加个链接名称:mask。
3、新建MC元件snow,新建图层中画个雪花的图形,在另一个图层第一关键桢加as:
     this.onEnterFrame = function() {
  //320是雪最后落的y坐标
  if (_y<320) {
  this._x += Math.random()*(this._xscale)/10;
  this._y += Math.random()*(this._yscale)/10;
  this._rotation += Math.random()*(_rotation)/10;
  switch (moving) {
  case "left" :
   _x += 2;
   break;
  case "right" :
   _x -= 2;
   break;
  }
 }
};
4、导入图片snow.jpg到库。
5、回主场景
6、新建图层pic,把库中的snow.jpg拖入到场景。
7、新建图层snow,把库中的元件snow拖入,给实例名称:snow
8、新建图层ActionScript,加as:
//i:记录雪片的数量的变量
var i = 1;
//moving:记录雪移动方向的变量
_global.moving = "right";
//加入个遮住场景外的中间空的大MC
_root.onLoad = function() {
 attachMovie("mask", "mask", 10000);
 this.mask._x = Stage.width/2;
 this.mask._y = Stage.height/2;
};
//复制600次
_root.onEnterFrame = function() {
 snow.duplicateMovieClip("snow"+i, i);
 //设置_x、_y、_xscale、_yscale、 _alpha属性
 setProperty("snow"+i, _x, random(500));
 setProperty("snow"+i, _y, random(50)+50);
 setProperty("snow"+i, _xscale, Math.random()*60+40);
 setProperty("snow"+i, _yscale, this["snow"+i]._xscale);
 setProperty("snow"+i, _alpha, Math.random()*50+50);
 i++;
 if (i>600) {
  i = 1;
 }
};
 
9、保存然后ctrl+enter
代码说明:
①mask的作用:因为我们是用duplicateMovieClip来复制mc,所以得到的mc的深度都大于1,为了让雪花不在场景外的地方出现,所以我们加了个深度比较高的(10000)的mask,这样mask就在最上面会遮住复制得到的其他MC。
②this["snow"+i]._xscale,这里用个[]数组访问运算符,代替 eval 函数,从而动态地设置并获取影片剪辑名称的值或一个对象的任何属性。由于这里的i是个变量,所以MC的名称是变化的,引用这些MC的名称时,就要使用[]来实现。
效果演示| 代码下载

在这个部分,介绍的东西比较简单,大家会用2个复制的方法,以及会用setProperty就可以了。

   MovieClipLoader对象的出现,使得我们Preload 图片和swf文件变的轻松惬意。我们可以把一个或更多的文件装载进一个mc或者是level,或者是为每一个load文件分配不同的对象。简单的说,比 loadMovie() 变的更为有用和强大。
     监听器提供了很多的load 状态 响应,我们来看一看:
•MovieClipLoader.onLoadStart() - invoked when loading begins.
•MovieClipLoader.onLoadProgress() - invoked as the loading process progresses.
•MovieClipLoader.getProgress() - used to obtain the progress of the downloaded file(s).
•MovieClipLoader.onLoadInit() - invoked after the actions in first frame of clip have executed.
•MovieClipLoader.onLoadComplete() - invoked when the entire downloaded file has been written to disk.
•MovieClipLoader.onLoadError() - invoked if the clip cannot be loaded.
•MovieClipLoader.unloadClip() - remove movies/images loaded with this method or cancels a load operation in progress.
    可以发现和MX比较,有更多的状态响应。我们从一个简单的例子来入手,了解一下它是如何实现的 。我们要做的是把一系列图片载入一个mc里。
1.新建一影片并在主时间轴第一frame上加AS:
function myTrace(msg)  {
  _root.traceBox.text += msg + newline;
  _root.traceBox.vPosition+=3;//滚动幅度
  _root.traceBox.vScrollPolicy ="on";//确定滚动条为“开”的状态
}
显然我们创建的一个trace函数,在发布的时候把一些信息显示在文本组件里。
2.然后拉进来一个文本组件,把文本框拉大,确保它能显示所有内容。并命名为 “traceBox”
3.创建一MC,在场景里拉进来3个(同一MC)。并把他们分别命名为:"myMC1", "myMC2" and "myMC3". 我们将把图片和swf载入到他们里面。大小为200象素,尽管我们要载入的图片比这大,但我们会在load的时候,重新定义图片的大小。
4.接下来要做的就是创建我们的MovieClipLoader object ,把下面的代码加到第一frame:
var myMCL = new MovieClipLoader();
5.第一帧代码继续:
myMCL.onLoadStart = function (targetMC) {
 var loadProgress = myMCL.getProgress(targetMC);
 myTrace ("The movieclip " + targetMC + " has started loading");
 myTrace("Bytes loaded at start=" + loadProgress.bytesLoaded);
 myTrace("Total bytes loaded at start=" +oadProgress.bytesTotal);
}

getProgress 属性将得到我们的目标MC(被装载对象)的载入信息:它返回两个参数——————bytesLoaded and bytesTotal。
这两个参数应该很熟悉的 MM把他们整合到了一起。得到进程-----getProgress
6.仍然是第一frame上,我们给mytrace 文本返回一些信息:
myMCL.onLoadProgress = function (targetMC,loadedBytes,totalBytes) {
  myTrace ("movie clip: " + targetMC);
  myTrace("Bytes loaded at progress callback=" + loadedBytes);
  myTrace("Bytes total at progress callback=" + totalBytes);
}
7.继续:
myMCL.onLoadComplete = function (targetMC)  {
  var loadProgress = myMCL.getProgress(targetMC);
  myTrace (targetMC + " has finished loading.");
  myTrace("Bytes loaded at end=" + loadProgress.bytesLoaded);
  myTrace("Bytes total at end=" + loadProgress.bytesTotal);
}
8.MX里的装载完毕的位置,大小等的定义总是麻烦,爱出毛病。
下面这个很GOOD。它是在完全装载进来的时候响应的:
myMCL.onLoadInit = function (targetMC)  {
  myTrace ("Movie clip:" + targetMC + " is now initialized");
  targetMC._width = 170;
  targetMC._height = 170;
}
9.纠错信息。如果我们要装载的对象无法载入呢?比方URL地址不对?
myMCL.onLoadError = function (targetMC, errorCode)  {
  myTrace ("ERRORCODE:" + errorCode);
  myTrace (targetMC + "Failed to load its content");
}
10.好了,一切都准备完毕。开始装载我们的对象吧:
myMCL.loadClip("http://www.yourdomain.com/test1.swf","_root.myMC1");
myMCL.loadClip("http://www.yourdomain.com/test2.swf ", "_root.myMC2");
myMCL.loadClip("http://www.yourdomain.com/somepic.jpg", "_level0.myMC3");
多么的惬意。。。
最后,你可以在不需要的时候卸载对象:
myMCL.unloadClip(target);//target specified as a string or integer
下面快要结束了,看一看别的装载方式吧:
myMCL.loadClip("http://www.yourdomain.com/test1.swf","_root.myMC1");
myMCL.loadClip("http://www.yourdomain.com/test1.swf","_level0.myMC1");
myMCL.loadClip("http://www.yourdomain.com/test1.swf", 1);//loads into level 1
myMCL.loadClip("http://www.yourdomain.com/test1.swf", _level0.myMC1);
myMCL.loadClip("file:///C:/foldername/images/somepic.jpg", "_level0.myMC4")

 

相关文章
绵阳网警