第5 卷第6 期

ActionScript 的应用研究
晏 明
(杭州师范学院信息工程学院,浙江杭州310036)
摘 要:介绍了应用ActionScript 对影片剪辑MovieClip 控制的要点,然后结合具体实例:MC 属性动态设
置、多个同一影片剪辑实例同时出现和数据库交换数据等,对如何在网络多媒体软件中使用ActionScript 进行
了分析和研究.
关键词:Flash MX ;动作脚本;多媒体软件;影片剪辑
中图分类号:G434      文献标识码:A
ActionScript 是Flash 中使用的动作脚本语言,类似于JS 等脚本,常用于交互式Flash 动画的创作.
可以借助ActionScript 脚本语言实现对矢量动画、影片剪辑的控制作用,增强作品的表现力,提高与用户
的互动性.ActionScrip 2 .0 的产生使Flash 向多媒体网络平台发展,利用它可以实现数据的传递、发送等,
可使制作出的多媒体软件具有更强的灵活性和交互性.
1  ActionScript 对影片剪辑的控制
影片剪辑MovieClip 简称MC ,是制作动画时使用频率最高、最常用的元件.人们经常把常用的单个
元素做成影片剪辑的形式,便于随时调用.对于影片剪辑可以利用ActionScript 来改变影片剪辑的属性、
复制多个同样的影片剪辑、剪辑事件管理、拖动影片剪辑、动态附加影片剪辑等.
1 .1  改变影片剪辑实例的位置和外观
用户常常希望在播放时改变影片剪辑的属性,可以使用setProperty 动作来实现.例如:SetProperty
(“mycartoon” ,_Alpha ,50) ,对影片剪辑实例mycartoon ,设置透明度为50% .Flash 提供了14 种影片剪辑
的目标属性,常用的有:_x 对象在X 轴方向上的位置;_Alpha 对象的透明度;_width 对象的宽度;_height
对象的高度;_Rotation 对象的旋转角度等.
12  复制和删除影片剪辑实例

在动画播放时,可以使用ActionScript 提供的duplicatMovieClip 函数来实现影片剪辑实例的动态复
制.用duplicateMovieClip()来复制剪辑实例有两种方法.
1 .2 .1  将duplicateMovieClip()作为一个全局函数来调用
duplicateMovieClip(target ,newname ,depth) ;
其中target 指定要复制的MovieClip 目标路径;newname 是复件MovieClip 实例名称;depth 是放置
新的MovieClip 实例的层级号.
1 .2 .2  将duplicateMovieClip()作为一个现有剪辑的方法来调用
myClip .duplicateMovieClip(newname ,depth) ;
myClip 是要复制剪辑的名称,newname 和depth 都和上一方法一致.所复制的影片剪辑总是从第一
帧开始播放,并且总是位于该时间轴中以前定义的影片剪辑的上面.
要删除用duplicateMovieClip()创建的影片剪辑,可以使用removeMovieClip 动作.
1 .3  拖曳影片剪辑实例
使用动画时,有时会要求通过拖动某影片剪辑到指定位置以实现交互或动画.要实现这样的效果,可
利用ActionScript 提供给的startDrag(target〔,lock[ ,left ,top ,right ,bottom]〕)与StopDrag()来实现.其
中target 指定要拖动的影片剪辑实例目的路径;lock 可选参数,指定一个逻辑值;top 、bottom 、left 、right
可选参数,指定影片剪辑的上、下、左、右拖动范围.StopDrag 动作则用于停止startDrag 启动的影片剪辑
拖动操作.例如以下代码用来检测两个物体或目标是否重叠和相交,如果相交或重叠,就执行相应的动作,
这对于做一些互动的动画和游戏非常有用.
square_mc .onPress = function() {
  this .startDrag() ;} ;
square_mc .onRelease = function() {
  this .stopDrag() ;
  if (this .hitTest(circle_mc)) {
   trace("you hit the circle") ;
  } } ;
1 .4  装载和卸载动画
可用loadMovie()(作为全局函数或者影片剪辑方法)将一个外部.swf 文件导入到播放器中,并把它
放在剪辑实例中或者编号层次中的基础影片之上.当外在.swf 文件被装载到一个层中的时候,它的主影
片时间线就成为该层的根时间线,它将代替以前载入这个层中的任何影片.当外部影片装载到当前影片剪
辑中也是如此,载入影片的主时间线将代替影片剪辑的时间线,将该剪辑现有的图形、声音和脚本卸载.
基本语法loadMovie(URL ,location) ,其中URL 是指定要装载的外在.swf 文件地址,location 参数
是要容纳新的.swf 文件的文档层.例如:loadMovie(“photos .swf” ,10) ;装载外在的动画photos .swf ,放
在第10 层运行.载入的动画播放完后,可以用unloadMovie(10) ;卸载该动画.
1 .5  从库中载入影片剪辑
要从库中载入影片剪辑,并把它作为动画的一部分播放,可以使用attachMovie()方法.但是和duplicateMovieClip()
不同是,attachMovie()不要求预先创建实例,它直接在影片库中从符号创建影片剪辑实
例.为了使用attachMovie()来创建一个符号的实例,必须首先从库中导出这个符号.导出影片剪辑符号
后,就可以将该符号的新实例添加到已经存在的剪辑中,调用方法是
my_mc .attachMovie(idname ,newname ,depth ) ;
其中my_mc 是要添加新实例剪辑的名称.如果my_mc 被遗漏,attachMovie()就会将新实例添加到
当前剪辑(attachMovie()语句所在的剪辑)中.idname 库中要附加到舞台上某影片剪辑元件的链接名称,
这是在“链接属性”对话框中“标识符”字段中输入的名称.newname 附加到该影片剪辑实例的唯一名称.
depth 指定所放位置的深度级别.例如以下程序
tu = new Array("a1" ,"a2" ,"a3" ,"a4" ,"a5" ,"a6" ,"a7" ,"a8") ;
for (i = 1 ; i < = 8 ;i + + ) {
 my_mc .attachMovie(tu[i - 1] ,"h" + i ,i) ;
 with (_root["h" + i]) {
2 杭州师范学院学报(自然科学版) 2006 年 
  _ x = 400 ;
  _ y = 300 ;
  _visible = false ;
 } }
从库中取元件(a1 、a2 ⋯)并将其附加到舞台上由my_ mc 指定的影片剪辑中.使用后可以用remove‐
MovieClip()或unloadMovie()删除用attachMovie()附加的影片剪辑.
2  ActionScript 应用举例
2 .1  影片剪辑实例属性的动态设置
在制作多媒体软件中,常希望影片中影片剪辑实例能按规律进行大小、位置、颜色等属性的变化.ActionScript
提供了setProperty(“target” ,property ,value/expression)的影片剪辑动作,利用它就可以设置
影片剪辑实例的位置、缩放比例、透明度、可见性、旋转角度等属性.
例如,平面镜成像多媒体软件,希望光线能跟着物体位置的改变一起运动.在此分别把光线命名为
“line1” 、“line2” 、“line3” 、“line4” 、“line5” 、“line6” ,在加入ActionScript 代码后,可以看到图1 中的效果就
会变成图2 的效果,实现对对象的控制.
图1  原效果图
         
图2  加入代码后效果图
在场景中编写如下代码(部分代码)
/ 倡使光线“line4” 、“line5” 、“line6”根据物体位置改变而改变倡/
candlex = candle ._ x ;
candley = candle ._ y ;
dot2 x = dot2 ._ x ;
dot2 y = dot2 ._ y ;
dis2 x = dot2 x‐candlex ;
dis2 y = dot2 y‐candley ;
dis2 = Math .sqrt (dis2 x 倡dis2 x + dis2 y 倡dis2 y) ;
angle2 = Math .atan (dis2 y/dis2 x) 倡180/Math .PI ;
m = ‐angle2 ;
if (m < 0) {
  m = ‐m ;}
setProperty("_root .line4" ,_rotation ,angle2) ;//设置“line4”的角度
setProperty("_root .line4" ,_xscale ,dis2 倡1 .65) ;//使“line4”拉长伸展
  第6 期 晏  明 :ActionScript 的应用研究 3
setProperty("_root .line5" ,_rotation ,‐angle2) ;// 设置“line5”的角度
setProperty("_root .line5" ,_ xscale ,dis2 倡1 .65) ;// 使“line5”拉长伸展
setProperty("_root .line6" ,_rotation ,‐angle2) ;// 设置“line6”的角度
setProperty("_root .line6" ,_ xscale ,dis2 倡1 .65) ;// 使“line6”拉长伸展
_root .inconer2 = Math .round(m) ;
⋯⋯以下略
2 .2  多个同一影片剪辑实例同时出现
当遇到在同一场景中需要一个影片剪辑实例同时出现多个效果,如何去实现呢? 当然可以在同一场
景中同时放上多个同一影片剪辑实例,但这样会使影片变得复杂.在此可以使用duplicatMovieClip(target
,newname ,depth)来复制影片剪辑实例,同时配合对影片剪辑实例属性的设置与修改,便能实现一个
影片剪辑实例同时出现多个效果.例如,漫天雪花场景的实现.
图3  漫天雪花场景
实现以上场景的主要代码如下
// 复制snow 为" snow " add i ,层深为i
duplicateMovieClip(snow ,"snow" add i ,i) ;
// 设置复制出的" snow" add i 在X 、Y 轴上随机出现的范围
setProperty("snow" add i ,_ x ,random(800) + 10) ;
setProperty("snow" add i ,_ y ,‐(random(10))) ;
//设置复制出的" snow" add i 的随机透明度变化范围
setProperty("snow" add i ,_alpha ,random(50) + 50) ;
// 每次循环加1 ,如果复制出的snow 数量等于200 ,返回第1 帧
i = i + 1 ;
if (i = = 200) {
  gotoAndPlay(1) ;}
便能实现如图3 的视觉效果.
2 .3  事件处理函数
如果遇到在动画中的运动对象是动态的、可控的,这就需要用到循环.注意:对运动对象的循环控制不
能用for 、while 等语句,而是用onEnterFrame()事件处理函数,它的作用是:按默认的帧频,让帧不断播
放.当然也可以用setInterval()函数代替onEnterFrame()函数,setInterval()函数的作用是每隔一定时
间,就调用函数、方法或对象.例如,各种曲线的动态绘制效果的实现.在场景中编写以下代码
MovieClip .prototype .dynaDrawSinu = function(h) {
  var p = 2 倡Math .PI ;
  var mc1 = this ;
4 杭州师范学院学报(自然科学版) 2006 年 
  mc1 .moveTo(0 ,0) ;
  var i = 0 ;
  mc1 .onEnterFrame = function() {
    mc1 .lineTo(i 倡180/Math .PI ,Math .sin(i) 倡h) ;
    i + = 0 .1 ;
    if (i > = p) {
      delete mc1 .onEnterFrame ;// 当符合条件时停止循环
    } } ;} ;
_root .createEmptyMovieClip("Sinu" ,1) ;
with (Sinu) {
  _ x + = 25
  _ y + = 150 ;
  lineStyle(1 ,0xff9900 ,100) ;
  dynaDrawSinu(150) ;}
便能实现如图4 的动态效果.
图4  函数曲线的动态效果
     
图5  和数据库连接
2 .4  和数据库交换数据
ActionScript 2 .0 支持XML 和XML Socket ,使得ActionScript 不仅能制作动画,还能与后台相连
接.后台语言可以对数据库进行管理,也就是说,ActionScript 可以利用后台程序实现基于数据库的数据
交换或基于文本文件的数据交换,并具有读取后台程序传递回来的数据或文本和向后台程序发送数据的
功能.
例如,留言板的制作.在main 场景中,在bg 层里把一些静态文本写好放在title 层里,在input 层里把
一些输入文本分别放置好,并设置各种信息的变量,如姓名:username ,电话:telephone ,邮箱:email ,QQ :
qq ,留言:content 等



原文地址:https://www.cnblogs.com/babyhhcsy/p/2874976.html