Android3D游戏——添加背景音乐与音效

fedora0的程序 2012-02-24

今天终于把主菜单做好了,虽然可能还有些小bug,不过在以后实现栏目功能的时候,应该都能处理好。

今天讲的是添加背景音乐和音效,做游戏怎么能没有声音呢,对不对。

一般添加声音是靠两种方法实现的。一种是MediaPlayer,一种是SoundPool。这两种方法的区别是MediaPlayer可以存储较大的音频文件,载入稍慢,不支持同时播放。而SoundPool只能存储较小的音频文件,载入较快,支持同时播放。这样就很显然了,MediaPlayer用来实现背景音乐,而SoundPool用来实现音效。

下面是我写的两个类,直接加到游戏中就可以用了,由于我开发的是小型的游戏,对声音处理的要求不高,更多的功能也没有写,不过基本功能都在了。

  1. package my.Game.audio;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import com.threed.jpct.Logger;  
  6.   
  7. import Android.app.Activity;  
  8. import android.content.res.AssetFileDescriptor;  
  9. import android.media.AudioManager;  
  10. import android.media.MediaPlayer;  
  11.   
  12. public class MyMusic {  
  13.   
  14.     protected static MediaPlayer mediaPlayer;  
  15.     protected static boolean mustResume = false;  
  16.     private static Activity act;  
  17.       
  18.     public MyMusic(Activity act){  
  19.         mediaPlayer = new MediaPlayer();  
  20.         MyMusic.act=act;  
  21.     }  
  22.       
  23.     public static void prepareMediaPlayer(String file) {  
  24.         if(mediaPlayer == null) {  
  25.             mediaPlayer = new MediaPlayer();  
  26.         }  
  27.           
  28.         AssetFileDescriptor afd = null;  
  29.         try {  
  30.             afd = act.getAssets().openFd("sound/"+file+".ogg");  
  31.         } catch (Exception e) {   
  32.             e.printStackTrace();  
  33.             Logger.log("Tried creating Music with missing asset ... " + file);  
  34.             System.exit(0);  
  35.             return;  
  36.         }  
  37.         try {  
  38.             mediaPlayer.reset();  
  39.             mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());  
  40.             mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  41.             afd.close();  
  42.         } catch (IOException e) {  
  43.             e.printStackTrace();  
  44.             Logger.log("Error setting data source in Music.play, IO exception");  
  45.             System.exit(0);  
  46.             return;  
  47.         } catch (IllegalStateException e) {  
  48.             e.printStackTrace();  
  49.             Logger.log("Error setting data source in Music.play, fail ...");  
  50.             return;  
  51.         }  
  52.         try {  
  53.             mediaPlayer.prepare();    
  54.         } catch (Exception e) {   
  55.             e.printStackTrace();  
  56.             Logger.log("Error preparing MediaPlayer");  
  57.             System.exit(0);  
  58.             return;  
  59.         }  
  60.     }  
  61.       
  62.       
  63.     public static void play(boolean loop) {  
  64.           
  65.         if(mediaPlayer == null) {  
  66.             Logger.log("error:MediaPlayer hasn't prepared.");  
  67.             return;  
  68.         }  
  69.         mediaPlayer.setLooping(loop);  
  70.         mediaPlayer.start();  
  71.     }  
  72.       
  73.       
  74.     public static void stop() {  
  75.         if(mediaPlayer == null) {  
  76.             Logger.log("error:No mediaPlayer is playing.");  
  77.             return;  
  78.         }  
  79.         mediaPlayer.stop();  
  80.     }  
  81.       
  82.       
  83.     public static void pause() {  
  84.         if(mediaPlayer == null) {  
  85.             Logger.log("error:No mediaPlayer is playing.");  
  86.             return;  
  87.         }  
  88.         mediaPlayer.pause();  
  89.     }  
  90.     public static void start(){  
  91.         if(mediaPlayer == null) {  
  92.             Logger.log("error:No mediaPlayer is prepared.");  
  93.             return;  
  94.         }  
  95.         mediaPlayer.start();  
  96.     }  
  97.       
  98.     public static void onPause() {  
  99.         if(mediaPlayer == null) {  
  100.             Logger.log("error:No mediaPlayer is playing.");  
  101.             return;  
  102.         }  
  103.         if(mediaPlayer.isPlaying()) {  
  104.             mediaPlayer.pause();  
  105.             mustResume = true;  
  106.         }  
  107.     }  
  108.       
  109.       
  110.     public static void onResume() {  
  111.         if(mediaPlayer == null) {  
  112.             Logger.log("error:No mediaPlayer is playing.");  
  113.             return;  
  114.         }  
  115.         if(mustResume) {  
  116.             mediaPlayer.start();  
  117.             mustResume = false;  
  118.         }  
  119.     }  
  120.       
  121.     public static MediaPlayer getMediaPlayer() {  
  122.         return mediaPlayer;  
  123.     }  
  124. }  
对了有一点要注意了,我有用到JPCT这个引擎,所以想用的这些类的话需要把该引擎中的方法删掉,这并不影响其中功能的实现。

相关推荐

ganyouxianjava / 0评论 2012-05-31