[转]ActionScript中的音效控制

http://bbs.9ria.com/viewthread.php?tid=73409&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D2592000

原始教程:Bird's Nest
Demo:SoundController

在製作Flash遊戲(或網站)時有時會播放一些音效或音樂,並且有控製聲音的按鈕,可以切換聲音的開關來控製整體的音效,想要放在某一類別進行控製,而不是將程式碼散置在各處,也許可以使用設計模式中的單態模式(Singleton Pattern)來實現這些功能。

【tw/com/birdnest/SoundController.as】
Step 1.一開始建立SoundController類別,使用Singleton Pattern的好處之一是不必擔心實例化許多物件而造成聲音互相重疊或不易控製。
private static var _instance:SoundController = null;

public static function getInstance():SoundController {
   //第一次使用初始化_instance,_instance為private因為無法直接取用,
   //而需透過getInstance()方法
   if (SoundController._instance == null){
      //加入聲音
      addSound(BACKGROUND_MUSIC_NAME , BACKGROUND_MUSIC_URL);
      addSound(THUNDER_BUTTON_SOUND_NAME , THUNDER_BUTTON_SOUND_URL);
      SoundController._instance = new SoundController();
   }
   return SoundController._instance;
}


Step 2.加入聲音addSound方法。這裡使用關連陣列加入每個Sound物件,些範例是直接需要用到的音效的路徑參數直接寫在SoundController,我想在遊戲的實作中應該需要有一個專門處理初始值的物件來處理這一塊會較好,畢竟遊戲中會用到的元素並不一定只會有聲音。
範例中我使用BACKGROUND_MUSIC_URL、BACKGROUND_MUSIC_NAME…等常數來避兔打錯字。
private static function addSound(soundName:String, url:String):void { 
   var sound:Sound = new Sound();
       sound.load(new URLRequest(url));
       sounds[soundName] = sound;                        
}


Step 3.播放聲音playSound方法。還滿單純的,直接使用for...in來找目前需要播放那一個音樂/音效。
public function playSound(soundName:String, 
                          startTime:Number = 0, 
                          loops:int = 1):void { 
   if (!_soundFlag) return;
   for (var tempName:String in sounds) {
      if (tempName == soundName) {
         sounds[tempName].play(startTime, loops);
         return;
      }
   }
}


Step 4.關閉所有聲音closeAllSound方法。SoundMixer.stopAll()靜態方法可以直接將所有的聲音關閉。
public function closeAllSound():void {
   _soundFlag = false;
   SoundMixer.stopAll();
}


Step 5.打開聲音openSound
public function openSound():void {
   _soundFlag = true;
}


除了上列的方法以外,遊戲中可能也會有其它需求,像是調背景音樂或音效大小、聲音位移的位置之類的功能,我想應該也可以加入一些方法來實作,目並還沒有實作這樣的功能。


使用方法:
【tw/com/birdnest/Main.as】
單純播放閃電的音效。
SoundController.getInstance().playSound(SoundController.THUNDER_BUTTON_SOUND_NAME);


【tw/com/birdnest/SoundButton.as】
建立一個開與關的功能,將所有的聲音開與關。
private var soundFlag:Boolean = true;
private function onochangesound(et:MouseEvent):void {
   soundFlag = !soundFlag;                                        
   if (soundFlag) {
      gotoAndPlay(1);
      soundController.openSound();
      soundController.playSound(SoundController.BACKGROUND_MUSIC_NAME, 
                                0, 
                                int.MAX_VALUE);
   }else {
      gotoAndStop("close");
      soundController.closeAllSound();
   }
}

你可能感兴趣的:(PHP,Flash,bbs,actionscript)