语录提交--登陆--注册--论坛交流--站长博客

AS菜鸟教程14 声音对象的使用

[作者:thymecd][日期:2008-01-23][导航:Flash教程 >> ActionScript2 >> AS菜鸟教程14 声音对象的使用]
  Sound对象

 

 

在时间轴中直接嵌入声音是制作Flash MV的一种通用手法,但是这种方法除了从头至尾地播放声音外,并不能对声音进行很好的控制。ActionScript内置的Sound对象(动作面板的“对象”/“影片”目录)为我们提供了管理和控制声音的一种好方法。

 

 

 

 

14.1  attachSound方法
Sound对象的attachSound方法与MovieClip对象的attachMovie方法类似,它在影片播放时将库中的声音元件附加到场景中。要使用该方法将声音附加到场景中,首先需要在库中为声音添加链接,为声音元件添加链接和为影片剪辑元件添加链接的方法类似,在要添加链接的声音元件中单击鼠标右键,在弹出的快捷菜单中选择“链接”命令,弹出“链接属性”对话框,如图14-1所示。
 
图14-1  “链接属性”对话框
进行如图14-1所示的设置后,单击“确定”按钮,添加链接后的声音元件如图14-2所示。
 
图14-2  添加链接后的声音元件
与Color对象和Date对象等其他内置对象一样,在使用Sound对象需要创建Sound对象的新实例,如下所示:
mySound = new Sound();
创建Sound对象的实例之后即可调用声音元件的链接,如下所示:
mySound.attachSound("music");
其中,attachSound方法的参数即是库中为声音元件添加的链接。仅仅执行以上操作还不够,必须使用下面的ActionScript让声音开始播放:
mySound.start();
如果操作执行无误,测试影片,一首动人的化蝶便开始播放了。
要停止用Sound对象播放的声音,可以使用如下所示的ActionScript:
mySound.stop();
14.2  练习:用按钮点歌
下面用以上的方法制作一个使用按钮点歌的影片,以加深对attachMovie方法的印象。
打开文件attachSound.fla,场景中添加了4个按钮和1个空影片剪辑,库中包含3个添加了链接的声音元件,它们的链接标识符分别为music1~music3,如图14-3所示
 
图14-3  attachSound.fla文件的编辑场景
在空影片剪辑的动作面板中添加如下所示的ActionScript:
onClipEvent (load) {
 _root.turn = 1;
}
变量turn用来记录当前播放的曲目位置。
第2个按钮用来播放当前位置的曲目,在它的的动作面板中添加如下所示的ActionScript:
on (release) {
 mySound.stop();
 mySound = new Sound();
 mySound.attachSound("music"+_root.turn);
 mySound.start();
}
不管当前是否有曲目正在播放,单击该按钮都将重新加载当前曲目,并从头开始播放。
第3个按钮用来停止播放当前位置的曲目,在它的动作面板中添加如下所示的ActionScript:
on (release) {
 mySound.stop();
}
单击该按钮,Sound对象停止播放。
第1个按钮用来使当前曲目回退一首并开始播放,在它的动作面板中添加如下所示的ActionScript:
on (release) {
 mySound.stop();
 _root.turn--;
 if (_root.turn<1) {
  _root.turn = 3;
 }
 mySound = new Sound();
 mySound.attachSound("music"+_root.turn);
 mySound.start();
}
单击该按钮,曲目位置回退一首,并判断是否超出第1首,如果是,则跳到第3首,从而实现循环。
第4个按钮的作用与第1个按钮相反,它使当前曲目前进一首并开始播放,在它的动作面板中添加如下所示的ActionScript:
on (release) {
 mySound.stop();
 _root.turn++;
 if (_root.turn>3) {
  _root.turn = 1;
 }
 mySound = new Sound();
 mySound.attachSound("music"+_root.turn);
 mySound.start();
}
单击该按钮,曲目位置前进一首,并判断是否超出第3首,如果是,则跳到第1首,从而实现循环。
14.3  loadSound方法
使用attachSound方法虽然可以动态地加载声音,但前提是需要将声音预先加入到库中,这样并不能避免文件过大的弊端。使用Sound对象的loadSound方法可以将Flash文件以外的MP3声音文件加载到影片中进行播放,这样可以有效地解决文件过大且播放的曲目有限的缺陷,使用loadSound方法可以播放计算机或网络中的任何MP3文件。
loadSound方法如下所示:
mySound.loadSound("url", isStreaming);
其中,url是指定要载入的MP3文件在计算机或网络中的路径,isStreaming是一个布尔值,用于指示加载的声音是作为事件声音还是作为声音流,为false时表示作为事件声音,为true时表示作为声音流。
事件声音在完全加载后才能播放。它们由动作脚本 Sound 对象进行管理,而且响应此对象的所有方法和属性。声音流在下载的同时播放。当接收的数据足以启动解压缩程序时,播放开始。
与attachMovie方法类似,使用loadSound方法的过程是:创建Sound对象、使用loadSound方法载入MP3文件、使用start命令播放声音以及使用Sound对象的其他方法控制声音或使用stop命令停止声音。
14.4  练习:从计算机中加载MP3
打开文件loadSound.fla,如图14-4所示。
 
图14-4  loadSound.fla文件的效果
其中有一个输入文本框,一个播放按钮和一个停止按钮。输入文本框的变量名为sound_url,在播放按钮的动作面板中添加了如下ActionScript:
on (release) {
 mySound.stop();
 mySound = new Sound();
 mySound.loadSound(sound_url, false);
 mySound.start();
}
单击该按钮,从输入文本框sound_url中获取MP3文件的路径,并将其作为事件声音(第2个参数为false)加载到影片中进行播放。
在停止按钮的动作面板中添加如下ActionScript:
on (release) {
 mySound.stop();
}
单击该按钮,声音停止播放。
14.5  调节和控制声音
Sound对象不仅提供了动态加载声音、播放和停止声音的方法,而且也提供了调节声音和控制进度等方法,综合使用这些方法,完全可以用Flash做出一个具有较高品质的音乐播放器。
= start方法
如前所示,不使用参数时,start方法简单地从开始位置播放声音;start方法也可以接受参数,如下所示:
mySound.start(secondOffset, loop);
参数secondOffset指定声音开始播放的位置,如指定10,将从第10秒的位置开始播放声音。参数loop指定声音的循环次数。
= setVolume方法
setVolume方法用来设置音量,其使用方法如下所示:
mySound.setVolume(volume);
参数volume的值位于0~100之间,0表示无音量,100表示最大音量,声音播放时默认的音量为100。
= setPan方法
setPan方法用来设置声音的左右均衡,其使用方法如下所示:
mySound.setPan(pan);
参数pan的值位于-100~100之间,-100表示仅使用左声道,100表示仅使用右声道,0表示左右声道均衡。
= getBytesTotal方法
getBytesTotal方法以字节为单位返回声音对象的总大小。
= duration属性
Sound对象的duration属性返回整个声音对象持续的毫秒数。
= position属性
Sound对象的position属性返回声音已播放的毫秒数。
使用duration属性和position属性可以方便地控制声音的播放进度,这在制作播放器时是非常有用的。
= onSoundComplete事件处理函数
当声音播放完时自动调用onSoundComplete事件处理函数。
14.6  练习:MP3播放器
MP3播放器的效果如图14-5所示。
 
图14-5  MP3播放器效果图
其中,单击打开文件按钮可以打开一个输入文本框,在其中可以输入MP3文件的路径,单击关闭文件按钮可以关闭输入文本框。
左边的五个按钮分别用于控制MP3的播放、快进、快退、暂停、停止,右边的三个游标分别用于控制音量、声道和显示MP3的播放进度。
当播放MP3时,控制相关影片剪辑播放动画,当MP3停止时,所有动画同时停止。播放器上部还显示了日期和时间。在播放器上按下鼠标可以拖动播放器到任意位置。
下面来看MP3播放器的制作过程。
(1)在影片剪辑实例url的动作面板中添加如下ActionScript:
onClipEvent (load) {
 _visible = false;                           //隐藏输入文本框
}
(2)在打开文件按钮的动作面板中添加如下ActionScript:
on (release) {
 _root.url._visible = true;                     //显示输入文本框
}
(3)在关闭文件按钮的动作面板中添加如下ActionScript:
on (release) {
 _root.url._visible = false;                    //隐藏输入文本框
}
(4)在播放按钮的动作面板中添加如下ActionScript:
on (release) {
 _root.music.stop();
 _root.music = new Sound();
 _root.music.loadSound(_root.url.music_url, false);
//music_url是输入文本变量名,它所在的影片剪辑实例名为url
 _root.music.start();                         //开始播放
 _root.music.onSoundComplete = function() {    //播放结束时停止相关动画
  _root.face.mcphone.gotoAndStop(1);
  _root.face.tyre.gotoAndStop(1);
  _root.scene.gotoAndStop(1);
 };
 if (_root.music.getBytesTotal()>0) {           //有声音载入时开始相关动画
  _root.face.mcphone.gotoAndPlay(2);
  _root.face.tyre.gotoAndPlay(2);
  _root.scene.gotoAndPlay(2);
 }
}
(5)在停止按钮的动作面板中添加如下ActionScript:
on (release) {                                 //停止声音和相关动画
 _root.music.stop();
 _root.face.mcphone.gotoAndStop(1);
 _root.face.tyre.gotoAndStop(1);
 _root.scene.gotoAndStop(1);
}
(6)在快进按钮中添加如下ActionScript:
on (release) {
 if ((_root.music.position/_root.music.duration)<0.95) {
  pos = _root.music.position/1000;         //获取MP3的当前进度
  _root.music.stop();
  _root.music.start((pos+0.05*_root.music.duration/1000), 1);
//从当前进度快进5%开始播放
  if (_root.music.getBytesTotal()>0) {      //有声音载入时播放相关动画
   _root.face.mcphone.gotoAndPlay(2);
   _root.face.tyre.gotoAndPlay(2);
   _root.scene.gotoAndPlay(2);
  }
 } else {
  _root.music.stop();
  _root.face.mcphone.gotoAndStop(1);
  _root.face.tyre.gotoAndStop(1);
  _root.scene.gotoAndStop(1);
 }
}
(7)在快退按钮的动作面板中添加如下ActionScript:
on (release) {
 if ((_root.music.position/_root.music.duration)>0.05) {
  pos = _root.music.position/1000;         //获取MP3的当前进度
  _root.music.stop();
  _root.music.start((pos-0.05*_root.music.duration/1000), 1);
//从当前进度快退5%开始播放
  if (_root.music.getBytesTotal()>0) {      //有声音载入时播放相关动画
   _root.face.mcphone.gotoAndPlay(2);
   _root.face.tyre.gotoAndPlay(2);
   _root.scene.gotoAndPlay(2);
  }
 } else {
  _root.music.start();
  if (_root.music.getBytesTotal()>0) {
   _root.face.mcphone.gotoAndPlay(2);
   _root.face.tyre.gotoAndPlay(2);
   _root.scene.gotoAndPlay(2);
  }
 }
}
(8)在暂停按钮的动作面板中添加如下ActionScript:
on (release) {
 if (pause != 1) {                         //pause!=1表示播放状态,停止声音
  _root.music.stop();                  //停止声音和相关动画
  _root.face.mcphone.gotoAndStop(1);
  _root.face.tyre.gotoAndStop(1);
  _root.scene.gotoAndStop(1);
  pos = _root.music.position;
  pause = 1;                         //标记暂停状态
 } else {                               //pause==1表示暂停状态,播放声音
  _root.music.start(pos/1000, 1);        //在停止位置开始声音
  if (_root.music.getBytesTotal()>0) {    //有声音载入时播放相关动画
   _root.face.mcphone.gotoAndPlay(2);
   _root.face.tyre.gotoAndPlay(2);
   _root.scene.gotoAndPlay(2);
  }
  pause = 0;                         //标记播放状态
 }
}
(9)控制音量、声道和进度的游标都是内嵌了按钮的影片剪辑。在音量游标影片剪辑的动作面板中添加如下ActionScript:
onClipEvent (load) {
 left = _x-100;
 right = _x;
 top = _y;
 bottom = _y;
}
onClipEvent (enterFrame) {
 _root.music.setVolume(_x-left);   //将音量游标和标尺左端的距离作为音量大小
}
(10)在音量游标内的按钮的动作面板中添加如下ActionScript:
on (press) {
 startDrag("", false, left, top, right, bottom);    //限制游标的拖动范围
}
(11)在声道游标影片剪辑的动作面板中添加如下ActionScript:
onClipEvent (load) {
 left = _x-50;
 right = _x+50;
 top = _y;
 bottom = _y;
 center = _x;
}
onClipEvent (enterFrame) {
 _root.music.setPan((_x-center)*2);  //将声道游标和标尺中点的距离作为声道值
}
on (release, releaseOutside) {
 stopDrag();
}
(12)在声道游标内的按钮的动作面板中添加如下ActionScript:
on (press) {
 startDrag("", false, left, top, right, bottom);    //限制游标的拖动范围
}
on (release, releaseOutside) {
 stopDrag();
}
(13)在进度游标影片剪辑的动作面板中添加如下ActionScript:
onClipEvent (load) {
 source = _x;
 left = _x;
 top = _y;
 right = _x+100;
 bottom = _y;
}
onClipEvent (enterFrame) {
 _x = source+100*(_root.music.position/_root.music.duration);
}
(14)在进度游标内的按钮的动作面板中添加如下ActionScript:
on (press) {
 startDrag("", false, left, top, right, bottom);
}
on (release, releaseOutside) {
 _root.music.stop();
 _root.music.start(((_root.face._xmouse-source)/100*_root.music.duration/1000), 1);
 stopDrag();
}
(15)在整个播放器影片剪辑的动作面板中添中如下ActionScript:
onClipEvent (load) {
 days = new Array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT');
 datetime = new Date();               //创建Date对象
}
onClipEvent (enterFrame) {
 mymonth = datetime.getMonth()+1;     //mymonth是显示月份的动态文本变量名
 mydate = datetime.getDate();          //mydate是显示日期的动态文本变量名
 day = datetime.getDay();
 myday = days[day];                 //myday是显示星期的动态文本变量名
 myhour = datetime.getHours();        //myhour是显示小时的动态文本变量名
 if (myhour<10) {
  myhour = "0"+myhour;
 }
 myminute = datetime.getMinutes();    //myminute是显示分钟的动态文本变量名
 if (myminute<10) {
  myminute = "0"+myminute;
 }
 mysecond = datetime.getSeconds();    //mysecond是显示秒的动态文本变量名
 if (mysecond<10) {
  mysecond = "0"+mysecond;
 }
 delete datetime;                    //删除Date对象
 datetime = new Date();              //获取新的系统时间
}
(16)在播放器影片剪辑中加入了一个透明度为0的按钮,在它的动作面板中添加如下ActionScript:
on (press) {
 this.startDrag("true");               //按下鼠标时拖动播放器
}
on (release, releaseOutside) {
 this.stopDrag();                    //释放鼠标时停止拖动播放器
}
(17)按Ctrl+Enter键测试影片,效果如图14-5所示。

[文章热度:]


上一页:AS菜鸟教程13 Date日期对象

下一页:AS菜鸟教程15 实现与服务器的交互

最新话题

网站导航

搜索

网站公告


Copyright 2007 51as.com. Some Rights Reserved.
鄂ICP备07003189号

Powered by: KingCMS 5.0.1.0217