我正试图在我的应用程序上播放背景音乐,并在你杀死敌人时偶尔发出声音效果。
所有声音效果都有效,但后来我开始使用MusicManager类(类似于本教程:http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion)尝试播放背景音乐并且它可以正常工作,但声音效果在半秒后被切断或者如此。
我正在播放声音效果:
MediaPlayer mp = MediaPlayer.create(context, R.raw.fire);
mp.start();
答案 0 :(得分:2)
改用soundpool。 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;
我将声音加载到那些位置并从中播放它们。 (记住你不想在每次运行时加载所有声音,只需加载一次。)接下来的两个参数是左/右音量,优先级,然后是-1设置为循环。
mSoundPool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);
这将我的soundpool设置为8个流。另一种是源类型,然后是质量。
玩得开心!