我希望 能对 Game 中的 游戏音效做一个 统一的管理 ,故设计如下:

利用XML 加载 外部MP3 保存到 MySoundModel 中 ,用 SoundBaseManager.as进行统一的音乐播放管理:

代码:

mySounds.xml:

MySoundModel.as:

/** * 音乐MODEL * @author Aonaufly * */public class MySoundModel{    public var $id : int;    public var $name : String;    public var $url : String;    public var $type : String;}

MySoundVO.as:

/** * 音乐资源类VO * */public class MySoundVO{    private var $data : Vector.
; private var $dic_sound : Dictionary; private var $cur_Index : uint = 0; private var $delay : int; private var $try : uint; private var $count : uint; private var $isOK : Boolean = false; //private var $sound : Sound; /** * @param $try : 重试几次加载 * @param $delay : 延迟多少毫秒重新开始加载 * */ public function MySoundVO($try: uint = 2 , $delay : int = 1000){ this.$try = $try; this.$delay = $delay; loaderXML(); } private function loaderXML() : void{ var $loader : URLLoader = new URLLoader(); $loader.addEventListener(Event.COMPLETE,__ $loader.addEventListener(IOErrorEvent.IO_ERROR,__onError); $loader.load(new URLRequest(Global.baseUrl+"resources/mySounds.xml")); } private function __ ( e : Event ) :void{ try{ clearTimeout($count); }catch( e : Error){} var $myxml : XML = new XML(e.target.data); trace("我得到的音乐 : " + $myxml); $data = new Vector.
(); var $cell : MySoundModel; for each( var $team : XML in $myxml.sounds.info){ $cell = new MySoundModel(); $cell.$id = $team.@id; $cell.$name = $team.@name; $cell.$url = $team.@url; $cell.$type = $team.@type; $data.push($cell); } $count = 0; $dic_sound = new Dictionary(); creatSound(); } /** * 制造一个Sound类 * */ private function creatSound() : void{ if($data != null && $count < $data.length){ var $sound : Sound = new Sound(); $sound.addEventListener(Event.COMPLETE,__onSoundLoaded); $sound.addEventListener(IOErrorEvent.IO_ERROR,__onSoundError); $sound.load(new URLRequest(Global.baseUrl + $data[$count].$url)); //return $sound; }else{ //return null; $isOK = true;//加载完成 } } private function __onSoundLoaded( e : Event ) : void{ var $mySound : Sound = e.target as Sound; var $id : int = $data[$count].$id; $dic_sound[$id] = $mySound; $count += 1; $mySound.removeEventListener(Event.COMPLETE,__onSoundLoaded); $mySound.removeEventListener(IOErrorEvent.IO_ERROR,__onSoundError); creatSound(); } private function __onSoundError( e : IOErrorEvent ) : void{ var $mySound : Sound = e.target as Sound; $mySound.removeEventListener(Event.COMPLETE,__onSoundLoaded); $mySound.removeEventListener(IOErrorEvent.IO_ERROR,__onSoundError); var $id : int = $data[$count].$id; trace("加载 音乐 失败 ID : " + $id); $count += 1; creatSound(); } private function __onError ( e : IOErrorEvent ) : void{ if($cur_Index < $try){ $count = setTimeout(loaderXML,$delay); } $cur_Index += 1; trace("加载音乐出现错误!!!"); } /** * 通过音乐ID得到音乐 * */ public function getSoundByID($soundID : int ) : Sound{ if( null != $dic_sound && $dic_sound[$soundID] != null){ return $dic_sound[$soundID]; }else{ return null; } } /** * 通过音乐Name 得到音乐 * */ public function getSoundByName($soundName : String ) : Sound{ if(null != $data && $data.length > 0){ var $$ii : int = 0; var $$len : uint = $data.length; while($$ii < $$len){ if($data[$$ii].$name == $soundName){ return $dic_sound[($data[$$ii].$id)]; break; } $$ii += 1; } return null; }else{ return null; } } private static var $instance : MySoundVO; public static function get Ins() : MySoundVO{ if( null == $instance ) $instance = new MySoundVO(); return $instance; } private function clone(source:Object):Sound{ var copier:ByteArray=new ByteArray(); copier.writeObject(source); copier.position=0; return(copier.readObject()); }}

SoundBaseManager.as:

/** * 音乐管理类 * @author Aonaufly * */public class SoundBaseManager{    private static var $instance : SoundBaseManager;    public static function get Ins() : SoundBaseManager{        if( null == $instance ) $instance = new SoundBaseManager();        return $instance;    }    public function SoundBaseManager() : void{        $soundChannelFormat = new SoundTransform();        $soundChannelFormat.volume = 1;    }    private var $len : uint;    private var $channel : SoundChannel;    private var $clear : uint = 0;    private var $soundChannelFormat : SoundTransform;    /***     * 缓存音乐资源     * */    public function catchSounds() : void{        MySoundVO.Ins;    }    /**     * 播放音乐     * @param $id : 音乐的ID号     * @param $len : 播放长度 以毫秒计算     * */    public function playById($id : int,$len : uint = 0) : void{        var $mySound : Sound = MySoundVO.Ins.getSoundByID($id);        if(null != $mySound){            this.$len = $len;            channelPaly($mySound);        }    }    /**     * 播放音乐     * @param $name : 音乐的名称     * @param $len : 播放长度 以毫秒计算     * */    public function playByName($name : String,$len : uint = 0) : void{        var $mySound : Sound = MySoundVO.Ins.getSoundByName($name);        if(null != $mySound){            this.$len = $len;            channelPaly($mySound);        }    }    private function channelPaly($mySound : Sound):void{        channelStop();        if($channel == null){            $channel = new SoundChannel();            $channel.soundTransform = $soundChannelFormat;        }        if(this.$len != 0 ){            if(this.$len > $mySound.length){                $len = $mySound.length;            }            $channel = $mySound.play(0,1);            $clear = setTimeout(channelStop,$len);        }else{            $channel = $mySound.play(0,1);        }    }    private function channelStop() : void{        if(null != $channel){            $channel.stop();        }        if($clear != 0){            try{                clearTimeout($clear);                $clear = 0;            }catch( e : Error ){}        }    }}