760 likes | 911 Vues
多媒体设计与制作专业教研室 王正友. 2D 动画脚本语言设计. 模块 04 拓展 (情境 05-08 ). 能力(技能)目标 1 .具有检测两个物体或目标是否重叠和相交形的能力。 2 .掌握播放动画的时,每隔一定时间就调用函数的方法。 3 .掌握外部的 SWF 文件或 JPEG 文件加载到 Flash Player 的能力。 4 . 掌握数组操作, 将元素添加到数组的结尾, 删除 数组中元素 。 知识目标 1 .碰撞检测函数 hitTest 。 2 .数组元素添加与删除 Array.push() 、 Array.splice() 。
E N D
多媒体设计与制作专业教研室 王正友 2D动画脚本语言设计
模块04 拓展(情境05-08) • 能力(技能)目标 1.具有检测两个物体或目标是否重叠和相交形的能力。 2.掌握播放动画的时,每隔一定时间就调用函数的方法。 3.掌握外部的SWF文件或JPEG文件加载到Flash Player的能力。 4 .掌握数组操作,将元素添加到数组的结尾,删除数组中元素。 • 知识目标 1.碰撞检测函数hitTest。 2.数组元素添加与删除 Array.push()、 Array.splice()。 3.间隔调用函数setInterval、clearInterval。 4.加载外部影片loadMovie。 5.加载外部文本或mp3文件loadVariables。 sppc
情境05 碰撞检测—hitTest函数—智力小测试 动画演示(源文件4-5-2.fla) 知识点:①碰撞检测—hitTest、②数组元素添加与删除 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判断语句联合使用。 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测试影片,我们会发现,一旦我们用鼠标碰触到了舞台上的方,输出面板里面就会显示出一句“亲到了”,一当鼠标进入方的内部,就会显示出一句"你亲到了我"。 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的形状与边框的理解。 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测试影片,我们会发现,一旦我们拖曳圆并碰触到了舞台上的方,则圆就变色。 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,下标为1 trace(myarray); //输出结果是: 1,3,4,5; myarray.splice(1,2); trace(myarray); //输出结果是: 1,4,5; 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) sppc
添加脚本 • 方法1、非函数方法求解 • 在主时间轴第1帧上写的脚本: • stop(); • i=0;//设置用于记数的变量 • 在圆(tx1_mc)上的脚本为: • on (press) { //鼠标按下时 • x = _x; //把本mc的坐标赋给本mc下的变量x,y • y = _y; • startDrag(this, true); //拖动这个mc • } • on (release) { //松开鼠标时 • stopDrag(); //停止拖动这个mc • if (this.hitTest(_root.wz1)) { //如果这个mc和动态文本wz1重叠或相交; • if (k != 1) { //这时如果这个mc上的变量k不为1 • _root.i++; //主时间轴上的变量i加1; • k = 1; • //在这个mc上设置变量k=1(使一个mc拖动正确时,主时间轴上的记数变量i只加1次) • } 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不同以及检测的文本不同,因此,这个自定义函数应该有两个参数。 sppc
添加脚本 • 在主时间轴第1帧上加上如下代码: • stop(); • i = 0; • function stlx(md, mc) { //md为拖动的mc,mc为检测的文本 • stopDrag(); • if (md.hitTest(mc)) { • if (md.k!=1) { //变量k是md上的,因此这里写成md.k • i++;//自定义函数是写在主时间轴上,因此主时间轴上的变量可以不用写路径 • md.k = 1; • } • if (i == 6) { • nextFrame(); • } • } else { • md._x = md.x; • md._y = md.y; • } • } 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帧 • } sppc
上机实验二十二 源文件4-5-2.fla、效果文件4-5-3.swf 1、用事件处理函数改造4-5-2中的源文件,要求: (1)脚本都写在主时间轴的第1帧上,所有mc上都不写脚本; (2)注意使用onPress,onRelease处理函数及循环语句。 sppc
上机实验二十二 源文件4-5-1.fla、效果文件4-5-4.swf 改造4-5-1中的源文件,把上面的文字和下面的mc的位置都分别作任意的排列。提示:把文字和mc的横坐标分别放入一个数组中。 sppc
情境06 动画间隔调用setInterval函数—雨中西湖 动画演示(源文件4-6.fla) • 知识点:setInterval、clearInterval、updateAfterEvent()。 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毫秒。 sppc
脚本语言 • 2)带参数调间隔调用 • function show1() { • trace("每隔1秒我就会显示一次"); • } • function show2(str) { • trace(str); • } • setInterval(show1,1000); • setInterval(show2,2000,"每隔2秒我就会显示一次"); • 这里“每隔2秒我就会显示一次”是参数,传递给str。 效果文件:间隔调用3.fla • 3)带对象的间隔调用 • 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是一个动态文本框的变量名字。 • } 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、用法举例 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 计时.fla • sec2 = time2.getSeconds(); datetime = String(hour2)+":"+String(minu2)+":"+String(sec2); • //这里的datetime是一个动态文本框变量名字。 • if (minu2-minu1 == 3) { //3分钟 • clearInterval(ppt); • } • } 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的作用就是使光标移动看起来更加顺畅。 sppc
交互分析 我们过去做下雨效果时,一般是通过帧的循环来复制雨滴的,帧的循环其实也就是间隔一定的时间。那么,我们当然也完全可以用setInterval来每隔一定时间就调用函数,而这个函数的功能就是复制一滴雨滴,并且设置其坐标。 动画演示(源文件4-6.fla) 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全部播放的时间,否则看不到涟漪。 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; • } • } • varsj;//设置变量 • sj=setInterval(xiayu,20,rain); //每隔20毫秒调函数xiayu一次。 • 运行程序,检查一下,效果和上面的程序是不是一样? sppc
上机实验二十三 效果文件 4-6-1.swf 1、使几个影片剪辑mc间隔相同时间播放,素材源文件4-6-1.fla。 sppc
上机实验二十三 效果文件 4-6-2.swf 2、不管顺序播放还是随机播放,使一个mc播放结束,后一个mc开始播放,这时的时间间隔等于输入文本的时间,素材源文件4-6-2.fla。 sppc
情境07 加载外部影片—loadMovie应用—画中画 动画演示(源文件4-7.fla) • 知识点:①loadMovie()、②MovieClip._lockroot、③getDepth、getNextHighestDepth()、。 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文件的左上角与目标影片剪辑的注册点对齐。 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"); } 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(); }; sppc
脚本语言 unloadMovie命令 删除用loadMovie命令加载的SWF文件或图片。 1、使用格式 unloadMovie(target) 参数说明: target:要删除的影片剪辑对象或表示要删除的影片剪辑路径的字符串。 2、用法举例 若要删除的影片剪辑“my_MC”,可先制作一个按钮,并给该按钮添加如下动作代码: on (press) { unloadMovie("my_MC"); } 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(); 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); • }; 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); • }; sppc
脚本语言 _global对象 变量是什么? 可以说就是存放信息的容器(更确切的说是指向内存空间中某个存贮位置的指针)。 全局变量,顾名思义就是在整个 Movie 中都可以访问的变量,全局变量和函数对于文档中的每一时间轴和范围而言都是可见的。它的声明比较特殊,若要创建具有全局范围的变量,请在变量名称前使用_global 标识符,并且不使用 var 语法。 例如: 在根时间轴第一帧上定义两个变量,然后将 trace()放在不同地点去返回它们的值,以观察它们的区别 Var a=5; _global.b=3; sppc
交互分析 制作思路:只要在同一场景中使用多个mc,使它们同时载入外部.swf文件或者jpg,那么就可以实现多画面效果。但是,在多画面与画中画的状态下,因为各mc载入外部.swf文件时有一个时间差,所以各画面仿电视的同步播放比较困难。这需要被调入的外部.swf文件和主场景文件的配合。 动画演示(源文件4-7.fla) 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上调入swf1 e._x=125; //设置目标元件e的坐标(即调入swf1的坐标) e._y=50; sppc
添加脚本 第2帧: clip=[a,b,c,d]; //设置数组对象,数组元素为4个目标mc lp=["瓢虫.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上调入swf1 a._x=125; //设置目标元件a的坐标(即调入swf1的坐标) a._y=50; a._xscale=50;//设置目标元件a的放大系数(即调入swf1的放大系数) a._yscale=50; j=k=0; //设置变量初值 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; 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的变化; 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(); //到下一帧停下 • } sppc
添加脚本 • 在“屏幕选择”按扭上的脚本 • on(press){ • txt="";//设置文本txt为空 • switch(j=j+1){//创建switch动作脚本语句的分支结构 • case1: //如果j==1,就执行 • a._alpha=40; //元件a是透明度为40 • break; //跳出switch循环体。以下类同 • case2: • a._alpha=100; • b._alpha=40; • break; • case3: • b._alpha=100; • c._alpha=40; • break; sppc
添加脚本 • 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; • } • } • } • case4: • c._alpha=100; • d._alpha=40; • break; • case5: • d._alpha=100; • j=0; • break; • } • } • 在“更换节目”按扭上的脚本 • on(release){ 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个元数表示的网址 • } sppc
上机实验二十四 素材源文件 4-7.fla 效果文件 4-7-1.fla 把2至4帧的脚本用自定义函数简化;把在“屏幕选择”按扭上的脚本用函数或者数组变量简化。 sppc
情境08 加载外部文件—文本和mp3文件—音频播放 动画演示(源文件:4-8.fla) • 知识点: ①onSoundComplete 、 ②loadSound、③XML 。 sppc
脚本语言 • 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
脚本语言 • loadSound命令 • 是从电影剪辑之外加载声音文件的方法 • 1、使用格式 • loadSound(URL, isStreamSound); • 参数说明: • 1)URL指定外部声音所在的URL • 2)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
脚本语言 • 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
脚本语言 • 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> sppc