请改用声音池。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 个流。另一个是源类型,然后是质量。
玩得开心!