本教材旨在講授兩個知識點,一個是對xml的讀取和解析,另一個是對載入外部音效的簡單播放控制。
工具/原料
Flashcs3(及其以上版本)
步驟/方法
首先我們新建一個舞臺,在舞臺上建立三個按鈕:載入btnLoad,播放btnPlay,暫停btnPause。,載入按鈕用來載入xml和音樂檔案,播放用來繼續播放聲音,暫停用來暫停聲音,如下圖所示:
首先我們要寫配置聲音資源的xml檔案,因為要加一個音樂,所以xml非常簡單。
按照順序,我們先寫“載入”按鈕上的函式功能。載入按鈕主要完成兩步工作,第一是讀取sndData.xml裡面的音樂路徑,第二是通過讀取到得路徑把音樂載入進來並播放。因此我們要定義一個聲音類變數。
var loadSound:Sound = new Sound();
//-------------------------------
addMouseEvent();
function addMouseEvent():void
{
btnLoad.addEventListener(MouseEvent.CLICK, loadSoundData);
}
function loadSoundData(e:MouseEvent):void
{
var xLoader:URLLoader = new URLLoader();
xLoader.addEventListener(Event.COMPLETE,completeLoadData);
xLoader.load(new URLRequest("sndData.xml"));
}
function completeLoadData(e:Event):void
{
var mXML:XML = XML(e.target.data);
var sndPath:String = String([email protected]);
trace(sndPath);
loadSound.load(new URLRequest(sndPath));
loadSound.addEventListener(Event.COMPLETE, completeLoadSound);
}
function completeLoadSound(e:Event):void
{
loadSound.play();
}
單擊“載入”按鈕,當這段程式碼被執行時,聲音便會被載入進來並且自動播放!
接下來寫聲音的暫停和播放按鈕。在AS3裡,為了控制聲音播放暫停,我們需要另外定義一個SoundChannel物件和一個記錄聲音播放位置的變數,來達到這一目的。
var loadSound:Sound = new Sound();
var sndChannel:SoundChannel;
var sndPostion:int;
//-------------------------------
addMouseEvent();
function addMouseEvent():void
{
btnLoad.addEventListener(MouseEvent.CLICK, loadSoundData);
btnPlay.addEventListener(MouseEvent.CLICK, continuPlaySnd);
btnPause.addEventListener(MouseEvent.CLICK, pauseSnd);
}
//播放暫停
function continuPlaySnd(e:MouseEvent):void
{
sndChannel = loadSound.play(sndPostion);
}
function pauseSnd(e:MouseEvent):void
{
sndPostion = sndChannel.position;
sndChannel.stop();
}
經過測試,似乎功能已經滿足,但是也有問題,當聲音在播放時,點選“播放按鈕”,聲音會二次播放重疊,其實,當聲音正在播放的時候,播放不需要處理,只有暫停的時候才讓它繼續播放;同理,聲音只有在播放的時候,暫停按鈕才能起作用。所以我們定義需要一個是否播放的狀態布林變數,當播放時為true,暫停時為false,在按鈕單擊時加以判斷:
var isSoundPlay:Boolean = false;
//播放暫停
function continuPlaySnd(e:MouseEvent):void
{
if(isSoundPlay)return;
isSoundPlay = true;
sndChannel = loadSound.play(sndPostion);
}
function pauseSnd(e:MouseEvent):void
{
if(!isSoundPlay)return;
isSoundPlay = false;
sndPostion = sndChannel.position;
sndChannel.stop();
}
此時測試音樂,一切都正常,但是舞臺上空白了很多,我們加一個波普效果,隨著音樂的播放暫停同步運動,這樣很明顯地看到你對音樂的控制了,如圖所示我們做一個簡單的波形動畫:
給波形動畫命名為mcWave,然後修改控制函式。
//播放暫停
function continuPlaySnd(e:MouseEvent):void
{
if(isSoundPlay)return;
isSoundPlay = true;
sndChannel = loadSound.play(sndPostion);
mcWave.play();
}
function pauseSnd(e:MouseEvent):void
{
if(!isSoundPlay)return;
isSoundPlay = false;
sndPostion = sndChannel.position;
sndChannel.stop();
mcWave.stop();
}
此時再測試,就會有一個波形直觀地顯示音樂的播放暫停了。
此時原始檔目錄如下:
完整程式碼如下:
var loadSound:Sound = new Sound();
var sndChannel:SoundChannel;
var sndPostion:int;
var isSoundPlay:Boolean = false;
mcWave.stop();
//-------------------------------
addMouseEvent();
function addMouseEvent():void
{
btnLoad.addEventListener(MouseEvent.CLICK, loadSoundData);
btnPlay.addEventListener(MouseEvent.CLICK, continuPlaySnd);
btnPause.addEventListener(MouseEvent.CLICK, pauseSnd);
}
//載入音樂
function loadSoundData(e:MouseEvent):void
{
var xLoader:URLLoader = new URLLoader();
xLoader.addEventListener(Event.COMPLETE,completeLoadData);
xLoader.load(new URLRequest("sndData.xml"));
}
function completeLoadData(e:Event):void
{
var mXML:XML = XML(e.target.data);
var sndPath:String = String([email protected]);
loadSound.load(new URLRequest(sndPath));
loadSound.addEventListener(Event.COMPLETE, completeLoadSound);
}
function completeLoadSound(e:Event):void
{
sndChannel = loadSound.play();
isSoundPlay = true
mcWave.play();
}
//播放暫停
function continuPlaySnd(e:MouseEvent):void
{
if(isSoundPlay)return;
isSoundPlay = true;
sndChannel = loadSound.play(sndPostion);
mcWave.play();
}
function pauseSnd(e:MouseEvent):void
{
if(!isSoundPlay)return;
isSoundPlay = false;
sndPostion = sndChannel.position;
sndChannel.stop();
mcWave.stop();
}
注意事項
聲音檔案有可能因為格式問題會導致載入失敗,此時需要轉換格式,建議用mp3格式。
以後在專門的聲音教程中講述聲音載入的錯誤處理。