在时间轴中直接嵌入声音是制作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所示。
[文章热度:]