最近在做一个android版的连连看小游戏,希望在游戏播放背景音乐以及音效,为此搜寻了相关资料,经过学习研究得出最终解决方案:MediaPlayer+SoundPool。
MediaPlayer 用来控制游戏背景音乐的播放。
SoundPool 播放游戏音效,在初始化时加载游戏中用的所有音效文件,然后在游戏中进行播放,这样声音没有延迟,保证了游戏的性能。最初我还想让背景音乐也使用 SoundPool进行播放,可是经过测试,总是不成功,而且在初始化时会很慢,不知道是不是因为SoundPool不适用较大的音乐文件?

特 别要说的是,我在网上看到有些文章在讲解实现游戏背景音乐的播放时,说要使用service,本人很不赞同。可能是因为大多讲解service的教程都喜 欢用音乐播放器的例子,所以很多人产生了一个误解,认为只要是播放音乐就要用到service。其实人家所说是开发一个音乐播放器,这个播放器需要在系统 后台持续播放歌曲,而不管是用户停留在当前应用界面还是退出到了系统桌面,或是切换到了另一个应用的界面,总之意思是说要在系统后台进行播放,这时必须要 用到service。而一个游戏的背景音乐仅仅需要在游戏运行的时候播放,而在返回到桌面或者进入其他应用使游戏的activity变为不可见时,都应该 立即停止播放,根本没必要使用service。
有人可能说播放背景音乐应该在后台执行,不能影响程序的正常运行,这样说当然正确,但这仅需要开辟 一个单独的线程来专门播放音乐就可以了,而经我测试,MediaPlayer和SoundPool本身都已经实现了在独立的线程中播放音乐,所以综上所述 在游戏中播放背景音乐完全没必要使用service,那样完全是舍近求远,画蛇添足之举。只需直接使用MediaPlayer即可。请看我的代码:

这是一个实现游戏中播放声音的类,封装了MediaPlayer和SoundPool的使用细节,所有方法都定义为静态方法,在程序启动时先调用其init方法,然后在任何地方都可以非常方便的使用



package 
    com.llkan.setup;  
   import 
    java.util.HashMap;  
   import 
    java.util.Map;  
   import 
    java.util.Random;  
   import 
    com.llkan.R;  
   import 
    android.content.Context;  
   import 
    android.media.AudioManager;  
   import 
    android.media.MediaPlayer;  
   import 
    android.media.SoundPool;  
   /** 
    * 声音控制类 *  
   @author 
    wyf *  
   */ 
     
   public 
     
   class 
    SoundPlayer {  
   private 
     
   static 
    MediaPlayer music;  
   private 
     
   static 
    SoundPool soundPool;  
   private 
     
   static 
     
   boolean 
    musicSt  
   = 
     
   true 
   ;  
   // 
   音乐开关 
     
     
   private 
     
   static 
     
   boolean 
    soundSt  
   = 
     
   true 
   ;  
   // 
   音效开关 
     
     
   private 
     
   static 
    Context context;  
   private 
     
   static 
     
   final 
     
   int 
   [] musicId  
   = 
    {R.raw.bg,R.raw.bg1,R.raw.bg2,R.raw.bg3};  
   private 
     
   static 
    Map 
   < 
   Integer,Integer 
   > 
    soundMap;  
   // 
   音效资源id与加载过后的音源id的映射关系表 
     
     
   /** 
    * 初始化方法 *  
   @param 
    c  
   */ 
     
   public 
     
   static 
     
   void 
    init(Context c) { context  
   = 
    c; initMusic(); initSound(); }  
   // 
   初始化音效播放器 
     
     
   private 
     
   static 
     
   void 
    initSound() { soundPool  
   = 
     
   new 
    SoundPool( 
   10 
   ,AudioManager.STREAM_MUSIC, 
   100 
   ); soundMap  
   = 
     
   new 
    HashMap 
   < 
   Integer,Integer 
   > 
   (); soundMap.put(R.raw.itemboom, soundPool.load(context, R.raw.itemboom,  
   1 
   )); soundMap.put(R.raw.sel, soundPool.load(context, R.raw.sel,  
   1 
   )); }  
   // 
   初始化音乐播放器 
     
     
   private 
     
   static 
     
   void 
    initMusic() {  
   int 
    r  
   = 
     
   new 
    Random().nextInt(musicId.length); music  
   = 
    MediaPlayer.create(context,musicId[r]); music.setLooping( 
   true 
   ); }  
   /** 
    * 播放音效 *  
   @param 
    resId 音效资源id  
   */ 
     
   public 
     
   static 
     
   void 
    playSound( 
   int 
    resId) {  
   if 
   (soundSt  
   == 
     
   false 
   )  
   return 
   ; Integer soundId  
   = 
    soundMap.get(resId);  
   if 
   (soundId  
   != 
     
   null 
   ) soundPool.play(soundId,  
   1 
   ,  
   1 
   ,  
   1 
   ,  
   0 
   ,  
   1 
   ); }  
   /** 
    * 暂停音乐  
   */ 
     
   public 
     
   static 
     
   void 
    pauseMusic() {  
   if 
   (music.isPlaying()) music.pause(); }  
   /** 
    * 播放音乐  
   */ 
     
   public 
     
   static 
     
   void 
    startMusic() {  
   if 
   (musicSt) music.start(); }  
   /** 
    * 切换一首音乐并播放  
   */ 
     
   public 
     
   static 
     
   void 
    changeAndPlayMusic() {  
   if 
   (music  
   != 
     
   null 
   ) music.release(); initMusic(); startMusic(); }  
   /** 
    * 获得音乐开关状态 *  
   @return 
     
   */ 
     
   public 
     
   static 
     
   boolean 
    isMusicSt() {  
   return 
    musicSt; }  
   /** 
    * 设置音乐开关 *  
   @param 
    musicSt  
   */ 
     
   public 
     
   static 
     
   void 
    setMusicSt( 
   boolean 
    musicSt) { SoundPlayer.musicSt  
   = 
    musicSt;  
   if 
   (musicSt) music.start();  
   else 
    music.stop(); }  
   /** 
    * 获得音效开关状态 *  
   @return 
     
   */ 
     
   public 
     
   static 
     
   boolean 
    isSoundSt() {  
   return 
    soundSt; }  
   /** 
    * 设置音效开关 *  
   @param 
    soundSt  
   */ 
     
   public 
     
   static 
     
   void 
    setSoundSt( 
   boolean 
    soundSt) { SoundPlayer.soundSt  
   = 
    soundSt; }  
   /** 
    * 发出‘邦’的声音  
   */ 
     
   public 
     
   static 
     
   void 
    boom() { playSound(R.raw.itemboom); } }