歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android3D游戲——添加背景音樂與音效

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

日期:2017/3/1 10:29:39   编辑:Linux編程

今天終於把主菜單做好了,雖然可能還有些小bug,不過在以後實現欄目功能的時候,應該都能處理好。

今天講的是添加背景音樂和音效,做游戲怎麼能沒有聲音呢,對不對。

一般添加聲音是靠兩種方法實現的。一種是MediaPlayer,一種是SoundPool。這兩種方法的區別是MediaPlayer可以存儲較大的音頻文件,載入稍慢,不支持同時播放。而SoundPool只能存儲較小的音頻文件,載入較快,支持同時播放。這樣就很顯然了,MediaPlayer用來實現背景音樂,而SoundPool用來實現音效。

下面是我寫的兩個類,直接加到游戲中就可以用了,由於我開發的是小型的游戲,對聲音處理的要求不高,更多的功能也沒有寫,不過基本功能都在了。

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