2D 动画脚本语言设计

76
2D 动动动动动动动动 多多 多多多多多多多多多多 多多多

description

多媒体设计与制作专业教研室 王正友. 2D 动画脚本语言设计. 模块 04 拓展 (情境 05-08 ). 能力(技能)目标 1 .具有检测两个物体或目标是否重叠和相交形的能力。 2 .掌握播放动画的时,每隔一定时间就调用函数的方法。 3 .掌握外部的 SWF 文件或 JPEG 文件加载到 Flash Player 的能力。 4 . 掌握数组操作, 将元素添加到数组的结尾, 删除 数组中元素 。 知识目标 1 .碰撞检测函数 hitTest 。 2 .数组元素添加与删除 Array.push() 、 Array.splice() 。 - PowerPoint PPT Presentation

Transcript of 2D 动画脚本语言设计

Page 1: 2D 动画脚本语言设计

2D 动画脚本语言设计

多媒体设计与制作专业教研室 王正友

Page 2: 2D 动画脚本语言设计

sppc

能力(技能)目标1 .具有检测两个物体或目标是否重叠和相交形的能力。2 .掌握播放动画的时,每隔一定时间就调用函数的方法。3 .掌握外部的 SWF 文件或 JPEG 文件加载到 Flash Player 的能

力。4 .掌握数组操作,将元素添加到数组的结尾,删除数组中元素。 知识目标1 .碰撞检测函数 hitTest 。2 .数组元素添加与删除 Array.push() 、 Array.splice() 。3 .间隔调用函数 setInterval、 clearInterval 。4 .加载外部影片 loadMovie 。5 .加载外部文本或 mp3 文件 loadVariables 。

模块 04 拓展(情境 05-08 )

Page 3: 2D 动画脚本语言设计

情境 05 碰撞检测— hitTest 函数—智力小测试

sppc

知识点:①碰撞检测— hitTest、②数组元素添加与删除

动画演示(源文件 4-5-2.fla )

Page 4: 2D 动画脚本语言设计

sppc

脚本语言hitTest 碰撞检测命令hitTest 语句在 Flash 游戏的运用中是必须的,比如在做点鞭炮、射击等的动画时,就可以用 hitTest 的方法,在 Flash 网站中实现某些效果时也会经常用到。最常见的例子是用他来实现二级菜单。 hitTest 是用来检测两个物体是否有重合的地方,或者检测某一个具体的坐标值是否在一个物体身上的语句。 1 、使用格式( 2 种形式)1 )Mc.hitTest(x,y,true/false)2 )Mc.hitTest(target)参数说明1 )第 1 种格式中,判断一个具体的坐标值是否在一个物体身上。影片剪辑 mc 和由 x , y 指定的点击区域重叠或交叉,则执行(大括号中)命令。参数 true 是指 mc 的整个实际形状; false 是指包含影片剪辑 mc 的矩形边框。2 )第 2 种格式中,判断两个物体是否重合,即是否同另一个交叉(即冲突检测)。影片剪辑 mc与 target 的目标路径指定的实例交叉或重叠。 target 参数通常表示带路径的实例名。两个语句被执行后,都会返回一个布尔值。如果碰触到(有重合的地方),则返回true 。如果没有碰触到(没有重合的地方),则返回 false 。所以,我们经常遇到的状况是,将碰撞检测语句和 if 判断语句联合使用。

Page 5: 2D 动画脚本语言设计

sppc

2 、用法举例1 )拖拽碰撞、鼠标位置碰撞检测首先在舞台上制作两个影片剪辑,一个是圆,一个是方,一个动态文本,圆的实例名为 yuan ,方的实例名为 fang ,动态文本的实例名为 aText 。在舞台中放置圆这 2 个影片剪辑和动态文本,在第一帧输入如下的脚本: _root.onEnterFrame = function() {

_root.yuan.startDrag(true);if (_root.yuan.hitTest(_root.fang)) {

aText.text = " 亲到了 ";} else {

aText.text = " 没有亲到 ";}if (fang.hitTest(_root._xmouse, _root._ymouse, true)) {

aText.text=“ 你亲到了我” ; 效果文件:亲 .fla

}};按 ctrl+Enter 测试影片,我们会发现,一旦我们用鼠标碰触到了舞台上的方,输出面板里面就会显示出一句“亲到了”,一当鼠标进入方的内部,就会显示出一句 "你亲到了我 "。

脚本语言

Page 6: 2D 动画脚本语言设计

sppc

2 )鼠标控制影片剪辑移动首先在舞台上制作 1 个球影片剪辑,实例名为 qiu_mc ,鼠标在(坐标_xmouse, _ymouse )影片剪辑 qiu_mc 上(与 qiu_mc 重叠或交叉)时, qiu_mc向右移动 10 个象素。在第一帧输入如下的脚本: qiu_mc 执行 onEnterFrame事件处理函数qiu_mc.onEnterFrame = function() {

if (this.hitTest(_xmouse, _ymouse, false)) { // 如果鼠标坐标与 qiu_mc 交叉或重叠(鼠标在 qiu_mc 上) this._x += 10; //qiu_mc横坐标增加 10 个象素;

} if (this._x>=500) {//qiu_mc横坐标大于或者等 于 500 个象素时 this._x = 0; // 重新设置 qiu_mc横坐标为 0 ; } 效果文件 4-5.fla};注意,把碰撞函数中的参数 false改为 true ,观测不同效果,加深对mc 的形状与边框的理解。

脚本语言

Page 7: 2D 动画脚本语言设计

sppc

3 )拖拽碰撞变色两个影片剪辑,一个是圆,一个是方,圆的实例名为 yuan ,方的实例名为

fang ,圆碰到方后就变个颜色。回到舞台中,在影片剪辑第一帧,按 F9打开动作面板,键入如下的脚本:

_root.onEnterFrame = function() {yuancolor = new Color(_root.yuan);yuancolor2 = yuancolor.getRGB(_root.yuan).toString(16);

效果文件 4-5-1.fla_root.yuan.startDrag(true);if (_root.yuan.hitTest(_root.fang)) {

yuancolor.setRGB(0xffff00);} else {

yuancolor.setRGB(yuancolor2);}updateAfterEvent();};按 ctrl+Enter 测试影片,我们会发现,一旦我们拖曳圆并碰触到了舞台

上的方,则圆就变色。

脚本语言

Page 8: 2D 动画脚本语言设计

sppc

将一个或多个元素添加到数组的结尾,并返回该数组的新长度1 、使用格式Array.push();2 、用法举例var myarray:Array = new Array(5, 8, "a");var c = myarray.push("b", "c");trace(" 添加元素后数组的长度是 :"+c); // 添加元素后数组的长度是 :5 trace(" 添加元素后的数组 :"+myarray); // 添加元素后的数组 :5,8,a,b,c

提取数组中的一部分,并将该部分作为新数组返回1 、使用格式Array.splice()2 、用法举例var myarray:Array=[1,2,3,4,5];myarray.splice(1,1); // 删除第二个数 2 ,下标为 1trace(myarray); // 输出结果是 : 1, 3 , 4 , 5 ;myarray.splice(1,2); trace(myarray); // 输出结果是 : 1, 4 , 5 ;

脚本语言

Page 9: 2D 动画脚本语言设计

sppc

交互分析

本例中,要把圆等 6 个图形拖到上面对应的文字上。 6 个图形分别是tx1_mc~tx6_mc;6 个对应的文字都是动态文本,名称分别是wz1~wz6 ,每个 mc拖动的位置如果出错了能够自动回到原来的位置,当 6 个mc 都能正确拖到对应位置上时,主时间轴从第 1 帧跳到第 2 帧,并给于文字说明。

显然,我们只要在一个 mc 上的脚本写对了,其它 5 个mc 就可以很方便的写出来,只要把其中的 wz1改为相应的 wz2~wz6 即可。

动画演示(源文件 4-5-2.fla )

Page 10: 2D 动画脚本语言设计

sppc

添加脚本方法 1 、非函数方法求解在主时间轴第 1 帧上写的脚本:stop();i=0; //设置用于记数的变量在圆( tx1_mc) 上的脚本为:on (press) { // 鼠标按下时

x = _x;//把本 mc 的坐标赋给本 mc 下的变量 x , yy = _y;startDrag(this, true); //拖动这个 mc

}on (release) { //松开鼠标时

stopDrag(); //停止拖动这个 mcif (this.hitTest(_root.wz1)) { // 如果这个 mc 和动态文本wz1 重叠或相交;

if (k != 1) { // 这时如果这个 mc 上的变量k 不为 1_root.i++; //主时间轴上的变量 i加 1 ;k = 1;

// 在这个 mc 上设置变量 k=1 (使一个 mc拖动正确时,主时间轴上的记数变量 i只加 1 次)

}

Page 11: 2D 动画脚本语言设计

sppc

if(_root.i==6){ // 如果主时间轴上的记数变量 i 等于6 时(图形都正确拖动完毕)

_root.nextFrame(); //主时间轴跳到下 1 帧停下;}} else { // 如果这个 mc 和动态文本 wz1不重叠或相交

_x = x; //把这个 mc 的坐标设置为前面得到的这个 mc的坐标的数值_y = y;

}}我们可以检测这段代码的正确性,然后把这段代码复制在其他 5 个mc 上,只要把其中的 wz1改为相应的 wz2~wz6 即可。方法 2 、函数方法求解既然这六个 mc 上的代码都非常接近,我们应该想办法用函数的办法来处理。这六个 mc 上的代码中只有拖动的 mc不同以及检测的文本不同,因此,这个自定义函数应该有两个参数。

添加脚本

Page 12: 2D 动画脚本语言设计

sppc

在主时间轴第 1 帧上加上如下代码:stop();i = 0;function stlx(md, mc) { //md为拖动的mc ,mc 为检测的文本stopDrag();if (md.hitTest(mc)) {

if (md.k!=1) { // 变量 k是md上的,因此这里写成md.ki++; // 自定义函数是写在主时间轴上,因此主时间轴上的变量可以不用写路径md.k = 1;

}if (i == 6) {nextFrame();

}} else {

md._x = md.x;md._y = md.y;

}}

添加脚本

Page 13: 2D 动画脚本语言设计

sppc

在mc 上的代码就可以大为简化在圆( tx1_mc) 上的代码就可以写成:on (press) {

x = _x;y = _y;startDrag(this, true);

}on (release) {_root.stlx(this, _root.wz1);//是在mc 上写的调函数脚本,因此这里的 stlx ()和wz1 都应该加上路径。

}把 tx1_mc 上的代码复制到其它 5 个mc 上,只把其中的 wz1换成wz2~~wz6 就行了。为了可以重复做这个练习,在主时间轴第 2 帧上加上一个按扭,在按扭上加上:on (release) {

prevFrame(); //回到第 1 帧}

添加脚本

Page 14: 2D 动画脚本语言设计

上机实验二十二

sppc

1 、用事件处理函数改造 4-5-2 中的源文件,要求:( 1 )脚本都写在主时间轴的第 1 帧上,所有 mc 上都不写脚本;( 2 )注意使用 onPress, onRelease处理函数及循环语句。

源文件 4-5-2.fla 、效果文件 4-5-3.swf

Page 15: 2D 动画脚本语言设计

sppc

上机实验二十二

改造 4-5-1 中的源文件,把上面的文字和下面的 mc 的位置都分别作任意的排列。提示:把文字和 mc 的横坐标分别放入一个数组中。

源文件 4-5-1.fla 、效果文件 4-5-4.swf

Page 16: 2D 动画脚本语言设计

sppc

情境 06 动画间隔调用 setInterval 函数—雨中西湖

知识点:setInterval、 clearInterval、 updateAfterEvent() 。

动画演示(源文件 4-6.fla )

Page 17: 2D 动画脚本语言设计

sppc

脚本语言

setInterval 命令动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象1 、使用格式setInterval(function, interval[,arg1,arg2,......argn])参数说明function :要调用的函数或方法;可以是匿名的函数、命名函数、对象方法或电影剪辑;interval :调用的时间间隔,毫秒为单位;arg :传递给将被调用的函数或方法的参数。2 、用法举例1) 匿名函数间隔调用。setInterval(function(){trace(" 每隔 1 秒钟我就会显示一次 ")},1000);// 这里的 function(){} 是没有函数名的函数。成为匿名函数,后面的1000 是时间间隔,单位是毫秒, 1秒 =1000毫秒, 1分钟 =60×1000=60000毫秒。

Page 18: 2D 动画脚本语言设计

sppc

2) 带参数调间隔调用function show1() {

trace(" 每隔 1 秒我就会显示一次 "); }

function show2(str) {trace(str); }

setInterval(show1,1000);setInterval(show2,2000," 每隔 2 秒我就会显示一次 ");这里“每隔 2 秒我就会显示一次”是参数,传递给 str 。 效果文件:间隔调用3.fla3 )带对象的间隔调用setInterval(show,1000); //每隔 1秒调函数 xiayu 一次function show() {

time = new Date();hour = time.getHours();minu = time.getMinutes();sec = time.getSeconds();datetime = String(hour)+":"+String(minu)+":"+String(sec);// 这里的 datetime 是一个动态文本框的变量名字。

}

脚本语言

Page 19: 2D 动画脚本语言设计

sppc

另外, Flash 提供了两个类型转换函数。 Number 函数可以将一个字符串转换成数字,相应的, String 函数可以将一个数字转换成一个字符串,当表达式中有字符串和数字时, ActionScript优先考虑字符串,将数字转换为字符串后再进行字符串运算。

上例中,可以将:datetime = String(hour)+":"+String(minu)

+":"+String(sec);改为:datetime = hour+":"+minu+":"+sec;

clearInterval 命令停止 setInterval() 调用。1 、使用格式clearInterval(intervalID:Number) : Void

参数说明intervalID:Number - 通过调用 setInterval() 而返回的数字

型(整数)标识符。2 、用法举例

脚本语言

Page 20: 2D 动画脚本语言设计

sppc

脚本语言PPT 计时时钟clearInterval(ppt);var ppt = setInterval(show, 1000);time1 = new Date();hour1 = time1.getHours();minu1 = time1.getMinutes();sec1 = time1.getSeconds();function show() {

time2 = new Date();hour2 = time2.getHours(); minu2 = time2.getMinutes(); 效果文件: ppt 计时 .flasec2 = time2.getSeconds(); datetime = String(hour2)+":"+String(minu2)+":"+String(sec2);// 这里的 datetime 是一个动态文本框变量名字。

if (minu2-minu1 == 3) { //3分钟clearInterval(ppt);

}}

Page 21: 2D 动画脚本语言设计

sppc

updateAfterEvent 命令有很多人做鼠标追随效果的时候,总是发现鼠标移动不流畅,不知该如何解决。其实方法很简单,你只需要加上一句 updateAfterEvent()就 ok 了。1 、使用格式updateAfterEvent ()在 onClipEvent() 处理函数内调用 updateAfterEvent 函数时,或将其作为传递给 setInterval() 的函数或方法的一部分进行调用时,将更新显示(与为影片设置的每秒帧数无关)。如果对 updateAfterEvent 的调用不在 onClipEvent() 处理函数内,也不是传递给 setInterval() 的函数或方法的一部分,则 Flash 将忽略该调用。此函数只对某些 Mouse 和 MovieClip 处理函数起作用: Mouse 类的 mouseDown、mouseUp、mouseMove、 keyDown 和 keyUp 处理函数; MovieClip 类的 onMouseMove、 onMouseDown、 onMouseUp、 onKeyDown 和 onKeyUp 处理函数。它对 Key 类不起作用。 其实说到底 updateAfterEvent 的作用就是使光标移动看起来更加顺畅。

脚本语言

Page 22: 2D 动画脚本语言设计

sppc

交互分析

我们过去做下雨效果时,一般是通过帧的循环来复制雨滴的,帧的循环其实也就是间隔一定的时间。那么,我们当然也完全可以用 setInterval 来每隔一定时间就调用函数,而这个函数的功能就是复制一滴雨滴,并且设置其坐标。

动画演示(源文件4-6.fla )

Page 23: 2D 动画脚本语言设计

sppc

添加脚本方法 1 :非参数调用在第一帧上的代码:i=0;drop._visible=0;function xiayu(){

duplicateMovieClip(drop,"r"+i,i);_root["r"+i]._x=Math.round(Math.random()*550);_root["r"+i]._y=Math.round(Math.random()*400);updateAfterEvent();i++;if(i==100){

i=0; }}var sj; // 设置变量sj=setInterval(xiayu,20);// 每隔 20毫秒调用函数 xiayu 一次,设置时间要大于影片剪辑实例 drop全部播放的时间,否则看不到涟漪。

Page 24: 2D 动画脚本语言设计

sppc

方法 2 :参数调用我们把 rain 做为参数传递,那么上面的程序可以改为:i=0;drop._visible=0;function xiayu(md){duplicateMovieClip(md,"r"+i,i)_root["r"+i]._x=Math.round(Math.random()*550);_root["r"+i]._y=Math.round(Math.random()*400);i++;if(i==100){

i=0;}

}var sj; //设置变量sj=setInterval(xiayu,20,rain); //每隔 20毫秒调函数 xiayu一次。运行程序,检查一下,效果和上面的程序是不是一样?

添加脚本

Page 25: 2D 动画脚本语言设计

sppc

上机实验二十三

1 、使几个影片剪辑 mc 间隔相同时间播放,素材源文件 4-6-1.fla 。

效果文件 4-6-1.swf

Page 26: 2D 动画脚本语言设计

sppc

上机实验二十三

2 、不管顺序播放还是随机播放,使一个 mc 播放结束,后一个 mc开始播放,这时的时间间隔等于输入文本的时间,素材源文件 4-6-2.fla。

效果文件 4-6-2.swf

Page 27: 2D 动画脚本语言设计

sppc

情境 07 加载外部影片— loadMovie应用—画中画

知识点:① loadMovie() 、② MovieClip._lockroot 、③ getDepth、 getNextHighestDepth() 、。

动画演示(源文件 4-7.fla )

Page 28: 2D 动画脚本语言设计

sppc

脚本语言loadMovie 命令加载外部的 SWF动画或者图片文件到 FLASH 影片中 。1 、使用格式loadMovie("url",target[,method]) 参数说明:参数说明( 1 ) url :要加载的 SWF 文件或图片文件所在的绝对路径或相对路径。使用相对路径一般应将播放的 .swf 文件与要加载的 .swf 文件放在同一文件夹中。绝对路径必须有详细的路径地址。( 2 ) target: 对影片剪辑的引用或者目标影片剪辑路径的字符串。( 3 )method:指定用于发送变量的HTTP方法,这个参数必须时字符串GET或者 POST。如果没有要发送的变量,就省略这个参数。GET方法用于发送少量的变量, POST方法用于发送长字符串的变量。这是个可选参数,一般可以不选。如果 SWF 文件加载到目标影片剪辑,则可使用该影片剪辑的目标路径来定位加载的 SWF 文件。加载到目标的 SWF 文件或图像会继承目标影片剪辑的位置、旋转和缩放属性。加载的图像或 SWF 文件的左上角与目标影片剪辑的注册点对齐。

Page 29: 2D 动画脚本语言设计

sppc

2 、用法举例例 1 :在同一目录下要加载一个名为“ my_MC.swf” 的影片到主场景中。可先制作一个按钮,并给该按钮添加如下动作代码:on (press) {

loadMovie("my_MC.swf", _root);}例 2 :在同一目录要加载 SWF 文件 aa.swf ,并替换舞台上已存在的名为my_MC 的影片剪辑。可先制作一个按钮,并给该按钮添加如下动作代码:on (press) {

loadMovie("aa.swf","my_MC");}例 3 :在同一目录要加载图片文件 a.jpg ,并替换舞台上已存在的名为my_MC 的影片剪辑。可先制作一个按钮,并给该按钮添加如下动作代码:on (press) {

loadMovie("a.jpg","my_mc");}

脚本语言

Page 30: 2D 动画脚本语言设计

sppc

脚本语言

例 4 :图片展示var tu=["photo01.jpg", "photo02.jpg", "photo03.jpg", "photo04.jpg"];var i = 0;function show() {

_root.createEmptyMovieClip("pic",0);_root.pic.loadMovie(tu[i]);_root.pic._alpha = 0;_root.pic._xscale = 10;_root.pic._yscale = 10;i++;i %= 4;_root.onEnterFrame = function() {

_root.pic._alpha += 7;_root.pic._xscale += 5;_root.pic._yscale += 5;if (_root.pic._alpha>=100) {

delete _root.onEnterFrame; 效果文件:图片展示 .fla

}};

}onMouseDown = function () {

show(); };

Page 31: 2D 动画脚本语言设计

SPPC

脚本语言

unloadMovie 命令删除用 loadMovie 命令加载的 SWF 文件或图片。1 、使用格式unloadMovie(target)参数说明:target :要删除的影片剪辑对象或表示要删除的影片剪辑路径的字符串。2 、用法举例若要删除的影片剪辑“ my_MC” ,可先制作一个按钮,并给该按钮添加如下动作代码:on (press) {

unloadMovie("my_MC");} 

Page 32: 2D 动画脚本语言设计

sppc

MovieClip._lockroot 命令因为用 loadMovie() 加载的外部文件是加载到一个 mc 元件上,所以,外部文件中指向场景 (_root) 的路径此时应该是指向这个 mc 元件而不是主文件的场景。使用 MovieClip._lockroot 可以使加载的文件中的_root仍然是指向原来文件的场景。MovieClip._lockroot它是一个布尔值。this._lockroot = true ;getNextHighestDepth 命令getNextHighestDepth方法可以返回影片剪辑下一个可用的最大深度值。更好的的理解就是当前最大的深度值加 1 。因此用这个深度值, MC 将在最上面。mc. getNextHighestDepth();getDepth 命令返回某个 MC 的深度,比如要返回 my_MC 的深度:var mydepth = my_MC.getDepth();

脚本语言

Page 33: 2D 动画脚本语言设计

sppc

用法举例for (i=1; i<6; i++) {

this.attachMovie("pic"+i,"pic"+i+"_mc",this.getNextHighestDepth());var pic_mc = eval("pic"+i+"_mc");pic_mc._x = 150+random(200);pic_mc._y = 100+random(200);

};pic1_mc.onRelease = function() {

var zddepth = _root.getNextHighestDepth()-1;var zd_mc:MovieClip = _root.getInstanceAtDepth(zddepth); 效果文件 深度交换 .fla this.swapDepths(zd_mc);

};pic2_mc.onRelease = function() {

var zddepth = _root.getNextHighestDepth()-1;var zd_mc:MovieClip = _root.getInstanceAtDepth(zddepth);this.swapDepths(zd_mc);

};

脚本语言

Page 34: 2D 动画脚本语言设计

sppc

pic3_mc.onRelease = function() {var zddepth = _root.getNextHighestDepth()-1;var zd_mc:MovieClip = _root.getInstanceAtDepth(zddepth);this.swapDepths(zd_mc);

};pic4_mc.onRelease = function() {

var zddepth = _root.getNextHighestDepth()-1;var zd_mc:MovieClip = _root.getInstanceAtDepth(zddepth);this.swapDepths(zd_mc);

};pic5_mc.onRelease = function() {

var zddepth = _root.getNextHighestDepth()-1;var zd_mc:MovieClip = _root.getInstanceAtDepth(zddepth);this.swapDepths(zd_mc);

};

脚本语言

Page 35: 2D 动画脚本语言设计

sppc

_global对象变量是什么 ? 可以说就是存放信息的容器(更确切的说是指向内存空间中某个存贮位置的指针)。全局变量,顾名思义就是在整个 Movie 中都可以访问的变量,全局变量和函数对于文档中的每一时间轴和范围而言都是可见的。它的声明比较特殊,若要创建具有全局范围的变量,请在变量名称前使用_global 标识符,并且不使用 var 语法。 例如 :在根时间轴第一帧上定义两个变量,然后将 trace()放在不同地点去返回它们的值,以观察它们的区别 Var a=5; _global.b=3;

脚本语言

Page 36: 2D 动画脚本语言设计

sppc

制作思路:只要在同一场景中使用多个 mc ,使它们同时载入外部 .swf 文件或者 jpg ,那么就可以实现多画面效果。但是,在多画面与画中画的状态下,因为各 mc 载入外部 .swf 文件时有一个时间差,所以各画面仿电视的同步播放比较困难。这需要被调入的外部 .swf 文件和主场景文件的配合。

交互分析

动画演示(源文件 4-7.fla )

Page 37: 2D 动画脚本语言设计

sppc

添加脚本

打开外部文件“ flower.fla” 文件, AS 脚本为:1 、在帧上的脚本第 1 帧:gotoAndPlay(x); //这个 x 是主场景中设置的全局变量;最后 1 帧:x=1 ; //设置本地变量 x

打开主文件 4-7.fla ,在这个源文件上的脚本如下:第 1 帧:stop();swf1="flower.swf"; //设置变量 swf1 来表示外部 .swf文件loadMovie(swf1,e); //在目标元件 e 上调入 swf1e._x=125; //设置目标元件 e 的坐标(即调入 swf1 的坐标)e._y=50;

Page 38: 2D 动画脚本语言设计

sppc

第 2 帧:clip=[a,b,c,d]; //设置数组对象,数组元素为 4 个目标mclp=["瓢虫 .swf","专业调音台 .swf","闪客起航 .swf","牧马制作 .swf"];//设置数组对象,数组元素为 swf,如网上调用,格式为: "http://bbs.flasher123.com/UploadFile/瓢虫 .swf"_global.x=_root.e._currentframe;// 把目标mc 播放的当前帧(即调入外部文件的当前帧)用全局变量 x 表示;//下面脚本中使调入外部文件的从全局变量 x 帧开始播放;m=getNextHighestDepth(); // 取得下一个可用的mc 的深度;a.swapDepths(m); //设置mc 元件 a 的深度为下一个可用的mc 的深度;loadMovie(swf1,a); //在目标元件 a 上调入 swf1a._x=125; //设置目标元件 a 的坐标(即调入 swf1 的坐标)a._y=50;a._xscale=50; //设置目标元件 a 的放大系数(即调入 swf1 的放大系数)a._yscale=50;j=k=0; //设置变量初值

添加脚本

Page 39: 2D 动画脚本语言设计

sppc

第 3 帧_global.x=_root.e._currentframe; //与第 2 帧上的脚本类同m=getNextHighestDepth()b.swapDepths(m)loadMovie(swf1,b);b._x=125;b._y=250;b._xscale=50;b._yscale=50;第 4 帧_global.x=_root.e._currentframe; //与第 2 帧上的脚本类同m=getNextHighestDepth()c.swapDepths(m)loadMovie(swf1,c);c._x=400;c._y=250;c._xscale=50;c._yscale=50;

添加脚本

Page 40: 2D 动画脚本语言设计

sppc

添加脚本

第 5 帧_global.x=_root.e._currentframe; //与第 2 帧上的脚本类同m=getNextHighestDepth();d.swapDepths(m);loadMovie(swf1,d);d._x=400;d._y=50;d._xscale=50;d._yscale=50;unloadMovie(e); //删除最开始调入的 swf

第 6 帧e._lockroot=true; //使被选中的元件在调入的外部文件的 _root指向本身的主时间轴loadMovie(lp[k],e); //配合按扭中的mc 的变化;

Page 41: 2D 动画脚本语言设计

sppc

2 、在按扭上的脚本在“多屏幕”按扭上的脚本:on(release){nextFrame();

}在“单屏”按扭上的脚本:on(release){for(i=0;i<4;i++){

unloadMovie(clip[i]); //删去元件 a,b,c,d上加载的外部 swf文件;clip[i].swapDepths(-i-1); //降低 a,b,c,d的深度,使元件 e 加载的 swf能显示出来;clip[i]._alpha=100; //元件 a,b,c,d的透明度有可能降低,这里把恢复它们的透明度

}nextFrame(); //到下一帧停下

}

添加脚本

Page 42: 2D 动画脚本语言设计

sppc

在“屏幕选择”按扭上的脚本on(press){txt=""; //设置文本 txt为空switch(j=j+1){ //创建 switch 动作脚本语句的分支结构

case1: //如果 j==1 ,就执行a._alpha=40; //元件 a 是透明度为 40break; // 跳出 switch循环体。以下类同

case2:a._alpha=100;b._alpha=40;break;

case3:b._alpha=100;c._alpha=40;break;

添加脚本

Page 43: 2D 动画脚本语言设计

sppc

case4:c._alpha=100;d._alpha=40;break;

case5:d._alpha=100;j=0;break;

}}

在“更换节目”按扭上的脚本on(release){

if(j==0){txt="请先选择屏幕 ";

}else{//当 j 不等于 0时,执行下列命令:

clip[j-1]._alpha=100;//恢复被选中的元件的透明度clip[j-1]._lockroot=true; //使被选中的元件在调入的外部

文件的 _root指向本身的主时间轴loadMovie(lp[k],clip[j-1]);//在 clip[j-1]元件中调入数组 lp

中第 k个元数表示的网址k++;if(k==lp.length){ //数组 lp 中

元素个数k=0;

}}

}

添加脚本

Page 44: 2D 动画脚本语言设计

sppc

在第 6 帧上“多屏”按扭上的脚本on(release){gotoAndStop(1);

}在第 6 帧上“更换节目”按扭上的脚本on(release){k++;if(k==4){ //数组 lp 中有 4 个元素k=0;

}e._lockroot=true;loadMovie(lp[k],e); //在 e 元件中调入数组 lp 中第 k个元数表示的网址

}

添加脚本

Page 45: 2D 动画脚本语言设计

sppc

上机实验二十四

素材源文件 4-7.fla 效果文件 4-7-1.fla

把 2 至 4 帧的脚本用自定义函数简化;把在“屏幕选择”按扭上的脚本用函数或者数组变量简化。

Page 46: 2D 动画脚本语言设计

sppc

情境 08 加载外部文件—文本和 mp3 文件—音频播放

知识点: ① onSoundComplete 、 ② loadSound 、③ XML 。

动画演示(源文件: 4-8.fla )

Page 47: 2D 动画脚本语言设计

onSoundComplete 命令onSoundComplete 是事件触发函数,当声音播放完成时触发。1 、使用格式

my_sound.onSoundComplete = function(){ // 此处是您的语句 }2 、用法举例用法 1 :下面的示例使用匿名函数:my_sound = new Sound(); my_sound.attachSound("mySoundID");my_sound.onSoundComplete = function() {

trace("mySoundID completed"); } my_sound.start();用法 2 :下面的示例使用命名函数:function callback1() {

trace("mySoundID completed"); }my_sound = new Sound(); my_sound.attachSound("mySoundID"); my_sound.onSoundComplete = callback1;my_sound.start();

sppc

脚本语言

Page 48: 2D 动画脚本语言设计

loadSound 命令是从电影剪辑之外加载声音文件的方法1 、使用格式 loadSound(URL, isStreamSound);参数说明:1 )URL 指定外部声音所在的 URL2 ) isStreamSound为 TRUE或 FALSE ,为 TRUE 时,表示加载的声音是声音流(既一边加载一边开始播放),为 FALSE 时,表示是事件声音(既要完全加载到内存后才能开始播放)。2 、用法举例用法 1) 載入事件聲音 ( 必須在完全載入後,才能夠播放 ) : var my_sound:Sound = new Sound(); my_sound.loadSound("song1.mp3", false); 用法 2) 載入串流聲音聲音 ( 既一边加载一边开始播放 ) : var my_sound:Sound = new Sound(); my_sound.loadSound("song1.mp3", true);

sppc

脚本语言

Page 49: 2D 动画脚本语言设计

XML 命令1 、使用格式1) 建立 XML对象:

var myXML = new XML(); 2) 引用 XML 文件:

myXML.load("data.xml"); 3)忽略空格: // 默认的为 false

myXML.ignoreWhite = true; 4)处理 XML对象的 load( XML.load 方法)public load(url:String) : Boolean从指定的 URL 中加载 XML 文档,并使用下载的 XML 数据替换指定 XML 对象的内容。该 URL 是相对 URL ,并使用 HTTP 进行调用。加载过程是异步的;它不会在执行 load() 方法后立即结束。执行 load() 方法时, XML 对象的 loaded 属性被设置为 false 。在 XML 数据下载完毕后, loaded 属性被设置为 true ,并调用 onLoad 事件处理函数。直到 XML 数据完全下载后,才开始分析。如果该 XML 对象以前包含任何 XML 树,它们将被放弃。您可以定义在调用 XML 对象的 onLoad 事件处理函数时执行的自定义函数。

sppc

脚本语言

Page 50: 2D 动画脚本语言设计

sppc

5)处理 XML对象的 onLoad( XML.onLoad 处理函数)   data.onLoad = function(success:Boolean) {statements;}  收到来自服务器的 XML 文档时由 Flash Player 调用。如果成功接收了 XML 文档,则 success 参数为 true 。如果未收到该文档,或从服务器接收响应时出现错误,则 success 参数为 false 。默认情况下,此方法的实现不处于活动状态。若要覆盖默认实现,必须指定一个包含自定义动作的函数。2 、用法举例1 )创建用于 profile.xml 文件<?xml version="1.0" encoding="Unicode"?> <personal> <profile> <name> 王晓明 </name> <sex>男</sex> <age>21</age> <city> 南宁 </city> </profile>

脚本语言

<profile> <name> 李繁 </name> <sex>女</sex> <age>21</age> <city> 上海 </city> </profile>

<profile> <name> 赵翼 </name> <sex>男</sex> <age>21</age> <city> 北京 </city> </profile></personal>

Page 51: 2D 动画脚本语言设计

sppc

2 ) Flash 调用的代码// 避免出现乱码System.useCodepage=true; // 创建一个 XML对象myXMLmyXML = new XML();// 创建一个 all 与 aa、 bb、 cc、 dd 的数组var all = new Array();var aa = new Array();var bb = new Array();var cc = new Array();var dd = new Array();//忽略包含空白的文本节点 效果文件 xmllx.flamyXML.ignoreWhite = true;//当 profile.xml完全装入 myXML 中时应进行的处理myXML.onLoad = function(success) {

// 如果将 profile.xml完全装入时if (success) {

// 获取myXML 对象中全部子节点对象的对象数组,对象数组中的每个数据元素都是 myXML 操作对象中的一个子节点对象。

脚本语言

Page 52: 2D 动画脚本语言设计

sppc

脚本语言

Page 53: 2D 动画脚本语言设计

sppc

交互分析

效果文件: 4-8.fla

制作思路:导入一个 MP3 的界面,界面上有播放按纽、暂停按纽和一个显示歌曲名字的界面。可以循环播放歌曲,制作方法可以全 AS 、组件及组件与 AS 结合,我们将分别介绍。

制作思路:导入一个 MP3 的界面,界面上有播放按纽、暂停按纽和一个显示歌曲名字的界面。可以循环播放歌曲,制作方法可以全 AS 、组件及组件与 AS 结合,我们将分别介绍。

MP3 组件菜单式播放器 .fla MP3 组件循环式播放器 .fla

Page 54: 2D 动画脚本语言设计

sppc

添加脚本1 、全 AS 编程制作Stage.showMenu = false; // 设置舞台Stage.scaleMode = "Scale"; var myXML = new XML(); // 定义 XML 和数组var mp3total = new Array();var mp3name = new Array();var mp3 = new Array();var s = new Sound(); // 定义 s 为声音类// 定义MP3和 XML 的路径var url = "music/"; // 定义歌曲 ID, 也就是第几第几首var id = 0;// 定义已播放时间 ,在后面的播放 /暂停按钮里会用得着的var played = 0;// 定义停止按钮参数 ,判断是否未停止播放 ,也就是说 key==true 时暂停按钮可以停止var key = true;// 定义暂停按钮参数 ,判断是否已经暂停播放var paused = false;

Page 55: 2D 动画脚本语言设计

sppc

// 定义预读函数function preloading() {

//给 preload赋予 enterframe事件 ,preload 就是进度条 ,后面会给大家解释preload.onEnterFrame = function() {//取得MP3 的总字节数和已下载字节数loaded = s.getBytesLoaded();total = s.getBytesTotal();//进度条显示的长度 ,取 160 的原因是因为最大长度有 160//注:用 _xscale 可以更简单、通用些this._width = loaded/total*160;if (loaded == total) {

// 下载完成后删除 enterframe事件delete this.onEnterFrame;

}};

}

添加脚本

Page 56: 2D 动画脚本语言设计

sppc

// 播放声音函数function loadsound(x) {

//把已播放时间设置为 0, 用处上面说过了played = 0;// 为暂停和停止按钮变量重新赋值paused = false;key = true;// 这里重复 s = new Sound() 是为了让声音已播放的毫秒数(position) 重置为 0s = new Sound();// 读取MP3,url 上面定义过了 ,是MP3 的路径 ,x 是函数里的参数 ,这里的 x 代表歌曲的 MP3名 ,后面的 true 是让声音以数据流的格式播放 s.loadSound(url+x,true);//trackname 是显示歌曲名的文本框 ,id已经被定义为歌曲的序列号 ,由于是从0 开始的 ,所以在这里要+1,总不能让第一首显示为 0 吧 ... 中间冒号里的内容是隔开序列号与 MP3 的曲名 ,你可以换成自己喜欢的符号 . 后面的 mp3name[id] 就是加载进数组里的 MP3 歌名了 ,下面一个函数里会做解释trackname = (id+1)+". - "+mp3name[id];

添加脚本

Page 57: 2D 动画脚本语言设计

sppc

//开始播放音乐s.start();//onSoundComplete 的作用是声音停止播放时调用后面的函数s.onSoundComplete = function() {// 这里是让判断问号 (?)前面的 (id == mp3total.length - 1) 是否成立 , 成立的话 id赋值为 0, 否则 id赋值为 id + 1 id = (id == mp3total.length-1) ? 0 : (id+1);// 执行 loadsound 函数 ,也就是现在的函数再执行一次 ,小括号里面参数是给函数里的 x 赋值为 mp3[id], 也就是歌曲名 ,mp3 这个数组在下面解释loadsound(mp3[id]);};

//mix 就是在右边 MP3 各个频率的音高 ,用个假的来代替 mix.gotoAndStop(1);// 执行 preloading 函数preloading();

}

添加脚本

Page 58: 2D 动画脚本语言设计

sppc

//XML解码myXML.ignoreWhite = true; // 使用运行播放器的操作系统的传统代码页来解释外部文本文件,避免出现乱码,如果 xml 文档保存为 Unicode 编码,要在第一帧里添加语句System.useCodepage = true; 如果文档保存为 utf-8 编码则不能加。System.useCodepage = true; // 预读 XML XML开始读取的时候执行下面的函数myXML.onLoad = function(success) {

if (success) { // 读取成功就开始分析 XML, parseXML 函数在下面解释

parseXML();} else {

trace(" 载入失败 "); }};//分析 XMLfunction parseXML() { //取得MP3 的总数

mp3total = myXML.firstChild.childNodes;// 建立 for循环

添加脚本

Page 59: 2D 动画脚本语言设计

sppc

for (var i = 0; i<mp3total.length; i++) { //把MP3 的歌曲名放到 mp3name 的数组里

mp3name[i] = mp3total[i].childNodes[0].firstChild.nodeValue;// 和上面道理差不多 , 只不过这里是放 mp3 的文件名mp3[i] = mp3total[i].childNodes[1].firstChild.nodeValue; }

play();}// 读取 XMLmyXML.load(url+"mp3list.xml");stop();

最后 1 帧// 上一首btn1.onPress = function() {

id = id == 0 ? mp3total.length-1 : id-1;loadsound(mp3[id]);

};

添加脚本

Page 60: 2D 动画脚本语言设计

sppc

//停止btn2.onPress = function() {

// 判断这个按钮是否可以按下去,可以按的话 ,就执行里面的语句if (key) {

//停止声音s.stop();//trackname 里面显示 STOP trackname = "STOP";//让mix停下来不乱跳mix.gotoAndPlay(1);played = 0;key = false;s = new Sound();

}};

添加脚本

Page 61: 2D 动画脚本语言设计

sppc

// 暂停 /播放btn3.onPress = function() {

if (key) {if (paused) {//从获取已播放多少的地方开始播放 ,由于 played 的单位是毫秒 ,所以在这里要除以 1000, 后面就是循环了s.start(played/1000,1);trackname = (id+1)+". - "+mp3name[id];mix.gotoAndStop(1);paused = false;} else {//给 played赋值 ,也就是已播放了多少毫秒

played = s.position;s.stop();mix.gotoAndPlay(1);trackname = "PAUSED";paused = true; }

} else {loadsound(mp3[id]); }

};

添加脚本

Page 62: 2D 动画脚本语言设计

sppc

// 下一首btn4.onPress = function() {

id = id == mp3total.length-1 ? 0 : id+1;loadsound(mp3[id]);

};//开始播放声音loadsound(mp3[id]);// 显示时间var time1 = time2=time3=time4=0;onEnterFrame = function () {

//position前面已说过 ,除以 60000 也就是除以 1000再除以 60, 为什么要这么做呢 ? 因为时间是 60进制的 , 把毫秒换成秒的单位后还要换成时间单位 ,int() 是取整的意思 ,也就把里面的东西化成整数 ,当前面的条件小于 10的时候 ,我们不能让时间这么显示吧 ? //如 : 12:1, 所以要加个 0 在前面 . //duration 就是歌曲的总长度了 . // 百分比符号在这里的作用不是百分比 ,是取余数的意思 ,如 9%5=4 //%60 也就是除以 60 后取它的余数了 ,肯定不会超过 60, 用来做秒正合适

添加脚本

Page 63: 2D 动画脚本语言设计

sppc

time1 = int(s.position/60000)<10 ? "0"+int(s.position/60000) : int(s.position/60000);time2 = int(s.position/1000%60)<10 ? "0"+int(s.position/1000%60) : int(s.position/1000%60);time3 = int(s.duration/60000)<10 ? "0"+int(s.duration/60000) : int(s.duration/60000);time4 = int(s.duration/1000%60)<10 ? "0"+int(s.duration/1000%60) : int(s.duration/1000%60);// 四个变量都好了以后 ,放到名为 timeline 的文本框里 ,这个文本框大家找找 ,就在歌曲名上面timeline = time1+":"+time2+" - "+time3+":"+time4;

};stop();

添加脚本

Page 64: 2D 动画脚本语言设计

sppc

mp3list.xml<?xml version="1.0" encoding="GB2312"?> <mp3lists> <song> <title> 天路 - 韩红 </title> <name> 天路 - 韩红 .mp3</name> </song> <song> <title> 莎拉布莱曼 </title> <name>shalabramen.mp3</name> </song> <song> <title> 凤凰传奇 </title> <name> 凤凰传奇 - 月亮之上 .mp3</name> </song> <song>

.......</mp3lists>

添加脚本

Page 65: 2D 动画脚本语言设计

sppc

2 、 Flash 组件制作

添加脚本

mediaplayback是 flash 中的组件之一,位置在 Media 下,可以用于制作播放界面。拖放一个 mediaplayback 到

场景,并将它命名为“ musicplayer” 。打开组件检查器面板,将 control visibility 设置为 on ,始终打开,播放类型默认为 flv ,将它设置为 mp3 。需要注意的是 mediaplayback并不支持某些非标准的 mp3 格式文件,所以一旦播放器不能播放你的 mp3 文件,你应该首先考虑换一个 mp3 试一试。在组件检查器的 url 栏内添上 mp3 文件的名称或地址,这里添上“如天路 韩红 .mp3” 就可以了。如果 MP3存放在 music 目录中,则变为“ music\ 如天路 - 韩红 .mp3” ,发布预览,是不是可以播放了,但是有个缺陷,只能播放一遍就停止了。

Page 66: 2D 动画脚本语言设计

sppc

添加脚本改进 1 :循环播放,我们只要在场景的第一帧上填写下面的 as 就可以了。myListener = new Object();myListener.complete = function() {

musicplayer.stop();musicplayer.play();

};musicplayer.addEventListener("complete",myListener);// 这里设置了一个监听,如果 musicplayer 播放完毕,则执行:musicplayer.stop();musicplayer.play();改进 2 :使用 contentPath 来记录播放内容的地址,可以不在组件中配置 URL 地址。musicplayer.contentPath=“music\ 如天路 - 韩红 .mp3”;改进 3使用外部文件播放,记录播放的歌曲的地址。将 combobox、 XMLconnector ,其位置分别User Interface、Data三类组件当中。将 combobox 命名(实例名)为 musiclist ,用于显示和选择播放内容;将XMLconnector 命名(实例名)为: xmlconn ,用于读取提前准备的好的xml 数据文件,

Page 67: 2D 动画脚本语言设计

xmlconnector并不会显示在版面上,所以可以放置在画布的外面。选择 xmlconnector 组件,参数标签栏里的 url

内添上 xml 文件的地址,这里因为存放在本地目录的下级目录music ,所以直接填写music\mp3song.xml 就可以了, direcrion选项选择receive ,这里不需要输出数据,如图 。选择 xmlconnector 组件,选择架构标签,选

择从示例 xml 文件读取架构按钮,在打开对话框内选择保存在本地的 xml 文件,架构标签里就会显示出xml 文件的基本架构,如图。

sppc

脚本语言

Page 68: 2D 动画脚本语言设计

sppc

选择 xmlconnector 组件,选择绑定标签,此时绑定是空的,点击加号添加绑定,在弹出的对话框中选择:item:Array ,因为这里是保存歌曲地址和名称的架构,如图:确定后,绑定栏内出现第一个绑定,接着选择下面的

bound to (绑定到),点后面的放大镜,在弹出的对话框中左边选择 ComboBox,<musiclist> ,右边选择dataProvider:Array ,即将它绑定到歌曲列表组件内,如图:选择场景的第一帧,添加一个行为,驱动 xmlconnector ,添加了一行 as:

 _root.xmlconn.trigger();继续下一步,绑定歌曲地址到

meidiaplayback的contentpath ,用鼠标选择舞台上的 xmlconnector 组件,组件检查器切换到绑定标签,添加一个绑定,这次我们选择 @url:string ,因为这个架构里面保存的是歌曲的地址信息。如图:

脚本语言

Page 69: 2D 动画脚本语言设计

sppc

脚本语言

接着选择下面的 bound to ,将它绑定到 mediaplayback的contentpath ,具体设置参考右图:

继续选择下面的 index for “item” ,默认为 0 ,点后面的放大镜,在弹出的对话框中将“使用常数值”前面的钩去掉,绑定索引导 commobox的selectedindex:number 上,这样就同播放器的列表建立了关联,设置如左图。

上面的实例,有 2 个缺点,其一没有开始马上播放,其二没有循环播放整个 MP3列表。

Page 70: 2D 动画脚本语言设计

sppc

3 、 Flash 组件与编程结合制作定义一 XML对象,并载入外部 XML 文件,载入后再将歌曲列表提取出来放入一数组中。接着用 attachMovie() 方法将 MediaController和MediaDisplay 组件载入舞台,然后设置各自的参数,并将二者相关联(Media.associateController() 或者 Media.associateDisplay() 方法都行)当一首歌曲播放完后,触发 MediaDisplay的 complete事件,在此事件中将MediaController和MediaDisplay 组件卸载并重新载入MediaController和MediaDisplay 组件(使用 attachMovie() 方法)并给一新的实例名,并设置 MediaDisplay 组件的播放内容为下一首歌曲,如此往复来播放所有的歌曲。制作步骤:1 )新建一个 FLASH 文档,设置舞台大小: 320*80 。2 )将组件 MediaController和MediaDisplay拖入舞台,然后从舞台上删除。这样做的目的是将这两个组件载入库中,为接下来用 attachMovie() 方法将MediaController和MediaDisplay 组件载入舞台做好准备。3 )新建一层,命名为 function 。在该层的第一帧上输入如下 AS代码:function init() {

flagNum = 1;// 播放歌曲的标示mp3Num = 0;attachController();

}

脚本语言

Page 71: 2D 动画脚本语言设计

sppc

//将MediaController和MediaDisplay 组件载入舞台并初始化function attachController() {

//将MediaDisplay 组件载入舞台并给定义实例名 "mp3Container" + flagNum_root.attachMovie("MediaDisplay","mp3Container"+flagNum,2);with (_root["mp3Container"+flagNum]) { // 设置组件初始参数

_x = 250;_y = 0;setMedia(myArray[mp3Num],"MP3");

}//将MediaController 组件载入舞台并给定义实例名 "mp3Controller" + flagNum_root.attachMovie("MediaController","mp3Controller"+flagNum,1);// 设置组件初始参数with (_root["mp3Controller"+flagNum]) {

_x = 0;_y = 0;activePlayControl = false;controllerPolicy = "on";//将MediaController和MediaDisplay 组件相关联associateDisplay(_root["mp3Container"+flagNum]); }

}

脚本语言

Page 72: 2D 动画脚本语言设计

sppc

function playNext() {//将MediaController和MediaDisplay 组件从舞台上删除_root["mp3Controller"+flagNum].removeMovieClip();_root["mp3Container"+flagNum].removeMovieClip();flagNum += 1;mp3Num += 1;// 如果播放到歌曲的最后一首,将 mp3Num = 0 ,意为将从头开始播放if (mp3Num == mp3Total) {

mp3Num = 0;}// 重新载入 MediaController和MediaDisplay 组件,并给一新的实例名 attachController();//因为每播放完一首歌曲后 MediaController和MediaDisplay 组件从舞台上被卸载//然后又重新载入 MediaController和MediaDisplay 组件并给了另外一个实例名// 所以要重新向注册的监听器广播事情_root["mp3Container"+flagNum].addEventListener("complete",myListener);

}

脚本语言

Page 73: 2D 动画脚本语言设计

sppc

4)新建一层,命名为 action ,在该层第一帧输入一下 AS代码:stop();var myArray = new Array(); // 数组 myArray 用来存储载入的 XML 文档中的歌曲名称var mp3Total:Number; // 歌曲的总数var myXml = new XML();myXml.ignoreWhite = true;myXml.load("music/mp3music.xml");myXml.onLoad = function() {

var e = myXml.firstChild.childNodes;mp3Total = e.length;for (var i = 0; i<mp3Total; i++) {

myArray.push(e[i].attributes["title"]);}init();_root["mp3Container"+flagNum].addEventListener("complete",myListener);

};var myListener = new Object();

myListener.complete = function(eventObject) {playNext();

};

脚本语言

Page 74: 2D 动画脚本语言设计

sppc

5 )保存文件。6 )创建 XML 文档:<?xml version="1.0" encoding="utf-8"?> <mp3lists> <item title="\music\ 天路 - 韩红 .mp3" /> <item title="\music\shalabramen.mp3" /> <item title="\music\ 凤凰传奇 - 月亮之上 .mp3" /> <item title="\music\ 刀郎 - 手心里的温柔 .mp3" /> <item title="\music\ 刀郎 -2002 年的的第一场雪 .mp3" /> <item title="\music\ 李茂山 -无言的结局 .mp3" /> <item title="\music\追梦人 .MP3" /> <item title="\music\ 阿木 - 有一种爱叫放手 .mp3" /> <item title="\music\ 遇见你是我的缘 .mp3" /> <item title="\music\ 唐磊 - 丁香花 .mp3" /> <item title="\music\ 黄玫瑰 .mp3" /></mp3lists>将该文件保存在与原 SWF 文件相同的文件夹中,命名为 mp3music.xml 。7 )在原文件目录music 下放入 mp3 ,这里的名称和歌曲数目可以自己修改XML 文件。注意:要想让播放器用于网站上,必须把 SWF 文件和 XML 以及MP3 文件上传到网站的同一个文件夹中。

脚本语言

Page 75: 2D 动画脚本语言设计

sppc

上机实验二十五

素材源文件 4-8-1.fla 效果文件 4-8-2.swf,4-8-3.swf

由 4-8-1.fla 文件上其它几个按扭添加脚本(根据按扭名称),使这个播放器增加随机播放与顺序播放;播放上一曲或者下一曲;暂停和停止功能。

Page 76: 2D 动画脚本语言设计

Thank you