2

我正在尝试在我的应用程序上播放背景音乐,并在您杀死敌人时偶尔播放音效之类的东西。

所有音效都有效,但后来我开始使用 MusicManager 类(类似于本教程:http ://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion )尝试播放背景音乐,它可以工作,但声音效果会在半秒左右后被砍掉。

我正在使用以下方法播放音效:

 MediaPlayer mp = MediaPlayer.create(context, R.raw.fire); 
 mp.start();
4

1 回答 1

2

请改用声音池。SoundPool 可以同时以不同的音量、速度和循环播放多个流。MediaPLayer 并不是真的要处理游戏音频。

我在市场上发布了 2 款游戏,都使用 SoundPool 并且没有问题。

这里这两个功能是从我的游戏中取出的。

   public static void playSound(int index, float speed) 
{       
         float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
         streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
         mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, speed); 
}
public static void playLoop(int index, float speed) 
{       
         float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
         streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
         streamVolume = streamVolume / 3f;
         mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, speed); 
}

就是这么容易。仔细看一下,我只使用我的 playLoop() 播放背景音乐,所以我降低了音量,但是您可以轻松修改代码以在每次播放时手动设置音量。

     mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, speed);

第一个参数 mSoundPoolMap.get(index) 只是一个包含我所有声音的容器。我为每个声音分配一个最终编号,例如

    final static int SOUND_FIRE = 0, SOUND_DEATH = 1, SOUND_OUCH = 2;

我将这些声音加载到这些位置并从中播放它们。(请记住,您不想在每次运行时都加载所有声音,只需加载一次。)接下来的 2 个参数是左/右音量、优先级,然后 -1 设置为循环。

    mSoundPool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);

这将我的声音池设置为 8 个流。另一个是源类型,然后是质量。

玩得开心!

于 2012-08-23T22:41:05.170 回答