歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android3D游戲——添加背景音樂與音效

今天終於把主菜單做好了,雖然可能還有些小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這個引擎,所以想用的這些類的話需要把該引擎中的方法刪掉,這並不影響其中功能的實現。
Copyright © Linux教程網 All Rights Reserved